繁体   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