Làm cách nào để tạo tập tin zip v2.0?


7

Làm cách nào để tạo tập tin zip v2.0 ?

Có vẻ như các tệp OpenDocument là các tệp zip v2.0:

$ file foo.odt
foo.odt: OpenDocument Text
$ hexdump -C -n 16 foo.odt
00000000  50 4b 03 04 14 00 00 08  00 00 03 0d 47 42 5e c6  |PK..........GB^.|
00000010

Byte thứ năm là 0x14.

Nhưng nếu tôi giải nén foo.odtvà nén lại bar.odt, tôi nhận được tệp zip v1.0:

$ unzip -d foo foo.odt
$ cd foo/
$ zip -0 -X ../bar.odt mimetype
$ zip -r ../bar.odt * -x mimetype
$ file ../bar.odt
bar.odt: Zip archive data, at least v1.0 to extract
$ hexdump -C -n 16 ../bar.odt
00000000  50 4b 03 04 0a 00 00 00  00 00 00 90 46 42 5e c6  |PK..........FB^.|
00000010

Byte thứ năm là 0x0a.

zip (2.32), Debian (6.0)

Câu trả lời:


6

Chỉnh sửa: OK. Câu hỏi thông báo đã được cập nhật để bạn không nhận được v0.1 mà là v1.0. không áp dụng nữa.

Phiên bản không phải là "khả năng" của tệp như thế nào mà là phiên bản tối thiểu được yêu cầu để trích xuất tệp đó từ trong kho lưu trữ.

Đây không phải là phiên bản tổng thể cho kho lưu trữ!

Một điểm khác biệt ở đây là ví dụ: thẻ OO tất cả các tệp có cùng yêu cầu phiên bản. Đến lượt nó là tệp trong tài liệu (lưu trữ trên tất cả) với yêu cầu cao nhất.

Đó là. Mỗi tệp có một tiêu đề zip chỉ định phiên bản tối thiểu cần thiết để giải nén nó. Ở trên, chúng ta thường có:

  archive-files    PackType  Zip-Required OO-Header `zip`-header
+--------------------------------------------------------------+
| mimetype         Store     1.0          2.0        1.0        |__ foo.odt
| content.xml      Deflate   2.0          2.0        2.0        |
+---------------------------------------------------------------+

Vì vậy, OO đặt cờ yêu cầu thành 2.0 mặc dù là 1.0. Tuy nhiên, điều này không ảnh hưởng đến khả năng mở tài liệu. (Bạn có thể mở tệp được nén bằng tay trong OO mặc dù mimetypeđược gắn thẻ v1.0).

Phiên bản

foo.odt:

1400   Version needed to extract.
0008   General Purpose
0000   Compression method

Phiên bản cần thiết để trích xuất , ở đây là byte thấp hơn 0x14, được dịch bằng cách chia và mô đun cho 10:

Major: 0x14 / 0x0a = 2
Minor: 0x14 % 0x0a = 0

Phiên bản Aka 2.0

Byte cao hơn 0x00cho biết tập tin tương thích với cái gì Nếu bằng 0, thì nó tương thích với MS-DOS (FAT, FAT32, VFAT). Khác nó được chỉ định bởi một ánh xạ. Ví dụ: nếu tôi sử dụng zipmà không có tùy chọn nào trên hệ thống của mình, tôi sẽ nhận được thông 0x03báo Unix. 0x0alà NTFS, v.v.

Phiên bản 2.0 cho biết: (4.4.3.2 Phiên bản tính năng tối thiểu hiện tại)

* File is a folder (directory)
* File is compressed using Deflate compression
* File is encrypted using traditional PKWARE encryption

Trong tệp zip của bạn, bạn có:

bar.odt:

0a00   Version needed to extract.
0000   General Purpose
0000   Compression method


Major: 0x0a / 0x0a = 1
Minor: 0x0a % 0x0a = 0

Phiên bản Aka 1.0


Phiên bản 1.0 chỉ đơn giản là giá trị mặc định.

Phân cấp tệp và phiên bản tối thiểu

Lý do bạn thấy phiên bản 1.0bên dưới Phiên bản cần trích xuất - đó là những gì bạn thực sự thấy là tiêu đề zip cho tệp mimetype. Tập tin này không bị xì hơi nhưng được lưu trữ mà không nén. Do đó, bạn chỉ cần phiên bản 1.0để giải nén tập tin đó. Tuy nhiên, đây không phải là phiên bản tổng thể của kho lưu trữ. Nếu bạn nhìn xuống dưới, bạn sẽ tìm thấy phiên bản 2.0 ngay khi bạn tìm thấy một tệp được lưu với độ lệch. Bạn có thể kiểm tra bằng cách:

hexdump -v -e '/1 "%02x "' bar.odt | grep -o '50 4b 03 04 .\{6\}'

Nên cung cấp cho bạn một cái gì đó như

50 4b 03 04 0a 00 
50 4b 03 04 0a 00 
...
50 4b 03 04 14 00 
50 4b 03 04 14 00 
50 4b 03 04 0a 00 
50 4b 03 04 14 00 
...
Tiêu đề tập tin thư mục trung tâm

Có một số tập tin với một tiêu đề mở rộng. Bạn có thể liệt kê những thứ này bằng cách:

hexdump -v -e '/1 "%02x "' foo.odt | grep -o '50 4b 01 02.\{16\}'

(Hãy nhớ rằng để đảo ngược 50 4b ...để 02 01 4b 50nếu hexdump -n 4 foo.odt nói như vậy)

Bằng cách này, bạn sẽ nhận được thông thường:

                  ____________ Version required (2.0)
                  |   |
50 4b 01 02 14 00 14 00 00 
50 4b 01 02 14 00 14 00 00 
50 4b 01 02 14 00 14 00 08
            |___| 
              |      
              +-------------- Version supported by packing application. v2.0

Trên ziptệp đã tạo, bạn có thể nhận được ví dụ:

                  ____________ Version required for this file (2.0)
                  |   |
50 4b 01 02 1e 03 14 00 00
            |___| 
              |      
              +-------------- Version supported by packing 
                              application. v3.0

Mục đích chung (và cờ khác được đặt trong tệp odt)

Đây là một lá cờ bit. Vì tệp của bạn là big-endian / Motorola, cờ trở thành:

0x0800 = 0000 1000 0000 0000
              |
              +---------------- 11 => File names and comments MUST be 
                                      stored as Utf-8.

Ít nhất LibreScript tiết kiệm hơn nữa với các mod khác nhau.

mimetypeluôn luôn là đầu tiên và không nên được nén. Điều này là để giúp phần mềm khác nhau để xác định các tập tin và nội dung của nó. Bằng cách này, người ta có thể ví dụ:

$ hexdump -C -s 38 -n 39 foo.odt

00000026  61 70 70 6c 69 63 61 74  69 6f 6e 2f 76 6e 64 2e  |application/vnd.|
00000036  6f 61 73 69 73 2e 6f 70  65 6e 64 6f 63 75 6d 65  |oasis.opendocume|
00000046  6e 74 2e 74 65 78 74                              |nt.text|

Mặc dù zipthường lưu tất cả các thư mục, OO chỉ lưu một thư mục nếu nó trống. Như vậy:

khóa kéo:

Thumbnails/
Thumbnails/thumbnail.png
META-INF/
META-INF/manifest.xml

oo:

Thumbnails/thumbnail.png
META-INF/manifest.xml

Và như thế ...


2

Tài liệu ODF là một tệp zip, như bạn nêu. Nhìn vào mục của Wikipedia . Các định dạng zip có nghĩa vụ phải có phiên bản ở 2 byte, little endian, tại offset 4. bắt đầu Một tiêu đề 0x04034b50(little endian, kiểm tra), phiên bản trong hai byte ( 0x000atrong trường hợp tự nén của bạn, 0x0014trong ODT của bạn và trong người tôi' đã nằm quanh đây từ năm 2006). Các định dạng chứa các phiên bản khác nhau.

Thật không may, các trang địa phương zip(1L)unzip(1L)người đàn ông của tôi hoàn toàn im lặng về các định dạng được xử lý, thật không may. Zip hiện tại của tôi tạo phiên bản 0x0014(zip-3.0-5.fc18.x86_64, Fedora 18). Có vẻ như bạn cần zip phiên bản 3 hoặc hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.