C# 跨.NET版本的GZipStream标头可靠吗?

C# 跨.NET版本的GZipStream标头可靠吗?,c#,.net,gzip,gzipstream,C#,.net,Gzip,Gzipstream,我来到Q&A和一些作者陈述,GZipStream确实将{0x1f,0x8b,8,0,0,0,0,0,0,4,0}字符作为头,以了解字节数组是否是压缩字符串 我的问题是,GZipStream头在.NET版本中可靠吗?它应该可靠,因为这个头来自GZip规范,因此不是特定于.NET的。有关这些值的说明,请参阅 然而,根据规范,只有前两个字节实际上总是相同的。第三个字节实际上总是相同的,因为当前只存在一个有效值。以下字节可能会更改。它应该是可靠的,因为此标头来自GZip规范,因此不是特定于.NET的。有

我来到Q&A和一些作者陈述,GZipStream确实将{0x1f,0x8b,8,0,0,0,0,0,0,4,0}字符作为头,以了解字节数组是否是压缩字符串


我的问题是,GZipStream头在.NET版本中可靠吗?

它应该可靠,因为这个头来自GZip规范,因此不是特定于.NET的。有关这些值的说明,请参阅


然而,根据规范,只有前两个字节实际上总是相同的。第三个字节实际上总是相同的,因为当前只存在一个有效值。以下字节可能会更改。

它应该是可靠的,因为此标头来自GZip规范,因此不是特定于.NET的。有关这些值的说明,请参阅


然而,根据规范,只有前两个字节实际上总是相同的。第三个字节实际上总是相同的,因为当前只存在一个有效值。以下字节可能会更改。

对于您所担保的任何GZip格式流:

前两个字节:1f,8b

下一个字节:00表示存储无压缩,01表示压缩算法,02表示打包,03表示lzf,08表示放气。NET到目前为止始终使用deflate,并且在许多情况下expect only deflate web客户端希望基于deflate的gzip作为标记为gzip的传输或内容编码,因此如果不添加某种选项来指定它,它就不太可能更改

下一个是文件类型,00表示可能是某种文本文件,因为GZipStream没有关于文件类型的信息,所以它总是使用它

接下来的四个是Unix格式的文件修改时间。同样,由于类没有关于文件的信息——因为它接收的是流,而不是包含元数据的文件,所以这些信息总是设置为0

下一个字节取决于压缩方法。使用deflate时,2表示严重压缩,4表示轻微压缩


序列中的下一个倒数取决于使用的操作系统类型。0表示FAT文件系统,但随着Windows转向使用其他文件系统(如NTFS),Windows继续使用它。如果在非Windows文件系统上与Mono一起使用,它可能具有不同的值,不过这种情况也可能决定与.NET行为相匹配。更新:在非Windows系统上,至少某些版本的Mono会将文件系统标志设置为非0。

对于任何GZip格式的流,您需要:

前两个字节:1f,8b

下一个字节:00表示存储无压缩,01表示压缩算法,02表示打包,03表示lzf,08表示放气。NET到目前为止始终使用deflate,并且在许多情况下expect only deflate web客户端希望基于deflate的gzip作为标记为gzip的传输或内容编码,因此如果不添加某种选项来指定它,它就不太可能更改

下一个是文件类型,00表示可能是某种文本文件,因为GZipStream没有关于文件类型的信息,所以它总是使用它

接下来的四个是Unix格式的文件修改时间。同样,由于类没有关于文件的信息——因为它接收的是流,而不是包含元数据的文件,所以这些信息总是设置为0

下一个字节取决于压缩方法。使用deflate时,2表示严重压缩,4表示轻微压缩


序列中的下一个倒数取决于使用的操作系统类型。0表示FAT文件系统,但随着Windows转向使用其他文件系统(如NTFS),Windows继续使用它。如果在非Windows文件系统上与Mono一起使用,它可能具有不同的值,不过这种情况也可能决定与.NET行为相匹配。更新:在非Windows系统上,至少某些版本的Mono会将文件系统标志设置为非0。

保证gzip流以0x1f 0x8b 0x08开始。除第三个字节中的0x08外,不支持其他压缩方法

所以,如果您没有看到0x1f 0x8b 0x08,那么它就不是gzip流。但是,如果确实看到0x1f 0x8b 0x08,那么它可能是或不是gzip流。可能是的,但你不能假设


对于候选gzip文件,您应该做的是简单地开始解压缩它。解码器将立即识别是否没有gzip头,并且如果有意外的gzip头,解码器将很快检测到压缩数据中的问题。您不必检查头,因为解码器已经检查了头,并且在检查之后检查有效的压缩数据。

保证gzip流以0x1f 0x8b 0x08开始。除第三个字节中的0x08外,不支持其他压缩方法

所以,如果您没有看到0x1f 0x8b 0x08,那么它就不是gzip流。但是,如果确实看到0x1f 0x8b 0x08,则可能是o r可能不是gzip流。可能是的,但你不能假设



对于候选gzip文件,您应该做的是简单地开始解压缩它。解码器将立即识别是否没有gzip头,并且如果有意外的gzip头,解码器将很快检测到压缩数据中的问题。您不必检查头,因为解码器已经检查了头,也不必检查压缩后的有效数据。

如果我更改参数化GZipStream的方式,它可能会更改,是不是我弄错了?对不起,如果我使用其他类或库来使用gzip压缩,它可能会更改。。。。对吧?不是前三个字节。但是剩下的可能会改变,谢谢你的努力。也许我会接受另一个答案,因为它提供了更多的背景,但这并不意味着你的答案是不正确的。很好too@Mat伊亚斯·菲德雷泽:当然,说吧。我也会这样做:如果我改变参数化GZipStream的方式,它可能会改变,我错了吗?对不起,如果我使用其他类或库来压缩gzip,它可能会改变。。。。对吧?不是前三个字节。但是剩下的可能会改变,谢谢你的努力。也许我会接受另一个答案,因为它提供了更多的背景,但这并不意味着你的答案是不正确的。很好too@Mat伊亚斯·菲德雷泽:当然,说吧。我也会这样做:根据,第三个字节压缩方法的值0到7是保留的,实际上只有值8是有效的。这个链接没有显示当前信息吗?看起来我应该接受这个答案,但我更愿意等待,看看是否没有人提供更多信息corrections@DanielHilgarthGNU GZip实用程序允许我提到的其他压缩方案,并使用我描述的标志,尽管我不知道有任何标准文档超过RFC 1952,正如您所说,将它们列为保留。尽管如此,如果您使用GNU GZip或任何与之兼容的东西,这些值还是可以找到的。不,GZip不接受也不生成第三个字节中的任何值,而是8。gzip将解压Unix compress和Unix pack文件,这两个文件的前两个字节不同,0x1f 0x9d表示compress,0x1f 0x1e表示pack。当你说lzf时,我想你是指lzh。gzip还将解压它,在前两个字节中标记为0x1f 0xa0。根据,第三个字节压缩方法的值0到7是保留的,只有值8实际有效。这个链接没有显示当前信息吗?看起来我应该接受这个答案,但我更愿意等待,看看是否没有人提供更多信息corrections@DanielHilgarthGNU GZip实用程序允许我提到的其他压缩方案,并使用我描述的标志,尽管我不知道有任何标准文档超过RFC 1952,正如您所说,将它们列为保留。尽管如此,如果您使用GNU GZip或任何与之兼容的东西,这些值还是可以找到的。不,GZip不接受也不生成第三个字节中的任何值,而是8。gzip将解压Unix compress和Unix pack文件,这两个文件的前两个字节不同,0x1f 0x9d表示compress,0x1f 0x1e表示pack。当你说lzf时,我想你是指lzh。gzip还将解压它,在前两个字节中标记为0x1f 0xa0。。。。因此,如果问题是数据无效,那么使用您的方法意味着尝试/捕获并禁用异常…异常有什么可怕的?使用这种方法可以确保它与GZipStream.ohhh NOOO的任何添加或更改保持最新!!没完没了的讨论!:D这样我们会发疯的。关于何时抛出和处理异常,有很多观点。虽然你是对的,但检查头可以避免可预测的异常,所以它毕竟不是那么异常。。。。因此,如果问题是数据无效,那么使用您的方法意味着尝试/捕获并禁用异常…异常有什么可怕的?使用这种方法可以确保它与GZipStream.ohhh NOOO的任何添加或更改保持最新!!没完没了的讨论!:D这样我们会发疯的。关于何时抛出和处理异常,有很多观点。