簡體   English   中英

為什么 GZIP “os” header 在 Java 中硬編碼為 FAT?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM