为什么GZIP "os "头在Java中被硬编码为FAT?

问题描述 投票:3回答:1

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行。. 我在四个不同的操作系统上进行了测试,确认写完后没有其他代码修改这个头。

为什么这个值是硬编码的?

java gzip
1个回答
1
投票

正如Elliott所指出的,根据你所引用的同一RFC的2.3.1.2节,将其设置为默认值是可以的。

合规的压缩器必须以正确的ID1、ID2、CM、CRC32和ISIZE生成文件,但可以将头的固定长度部分的所有其他字段设置为默认值(OS为255,所有其他字段为0)。压缩器必须将所有保留位设置为0。

然而,根据这个片段,默认值仍然是不正确的--默认值为 OS 标志是255,而不是0。这是一个 已知错误 在JDK中,根据 JDK-8244706.

© www.soinside.com 2019 - 2024. All rights reserved.