[英]Why is the GZIP “os” header hard-coded to FAT in Java?
RFC 1952第 2.3.1 節指定 GZIP 標頭必須包含OS
標志:
OS
(操作系統) 。 這標識了發生壓縮的文件系統的類型。 這在確定文本文件的行尾約定時可能很有用。 當前定義的值如下:
0 - FAT filesystem (MS-DOS, OS/2, NT/Win32)
1 - Amiga
2 - VMS (or OpenVMS)
3 - Unix
4 - VM/CMS
5 - Atari TOS
6 - HPFS filesystem (OS/2, NT)
7 - Macintosh
8 - Z-System
9 - CP/M
10 - TOPS-20
11 - NTFS filesystem (NT)
12 - QDOS
13 - Acorn RISCOS
255 - unknown
但是,Java 的 GZIP 序列化在所有情況下都會寫入零,如GzipOutputStream.java 的第 193 行所示。 我已經在四種不同的操作系統上運行測試,以確認沒有其他代碼在編寫后修改此 header。
為什么這個值是硬編碼的?
正如 Elliott 指出的那樣,根據您引用的同一 RFC 的第 2.3.1.2 節,將其設置為默認值即可:
兼容的壓縮器必須生成具有正確 ID1、ID2、CM、CRC32 和 ISIZE 的文件,但可以將 header 的固定長度部分中的所有其他字段設置為默認值(操作系統為 255,所有其他字段為 0)。 壓縮器必須將所有保留位設置為零。
但是,根據這個片段,默認值仍然不正確 - OS
標志的默認值是 255,而不是 0。根據JDK-8244706 ,這是 JDK 中的一個已知錯誤。 它已在 Java 版本 16,早期訪問版本 16 中修復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.