GzipStream
有没有办法知道 byte[] 是否已被.net 类压缩(或未压缩) ?
编辑: 只想知道 byte[] 数组是否已压缩(因为我将始终使用 GzipStream 进行压缩和解压缩)
GzipStream
有没有办法知道 byte[] 是否已被.net 类压缩(或未压缩) ?
编辑: 只想知道 byte[] 数组是否已压缩(因为我将始终使用 GzipStream 进行压缩和解压缩)
GZipStream是带有附加标头和尾标的DeflateStream 。
格式在RFC 1952中指定。
.NET 4.0 GZipStream类将以下字节作为标头写入:
byte[] headerBytes = new byte[] { 0x1f, 0x8b, 8, 0, 0, 0, 0, 0, 4, 0 };
if (compressionLevel == 10)
{
headerBytes[8] = 2;
}
尾部由CRC32校验和和未压缩数据的长度组成。
感谢@dtd 的解释,这对我有用:(@stackoverflowuser,你可能想要这个?)
public static class CompressionHelper
{
public static byte[] GZipHeaderBytes = {0x1f, 0x8b, 8, 0, 0, 0, 0, 0, 4, 0};
public static byte[] GZipLevel10HeaderBytes = {0x1f, 0x8b, 8, 0, 0, 0, 0, 0, 2, 0};
public static bool IsPossiblyGZippedBytes(this byte[] a)
{
var yes = a.Length > 10;
if (!yes)
{
return false;
}
var header = a.SubArray(0, 10);
return header.SequenceEqual(GZipHeaderBytes) || header.SequenceEqual(GZipLevel10HeaderBytes);
}
}
您可以查看魔术头的前几个字节以查看它是否已压缩,但除非 .net 压缩器将其他信息写入评论或其他可选字段之一,否则您可能无法分辨压缩器是谁。
http://www.onicos.com/staff/iz/formats/gzip.html
您还可以查看操作系统类型字段以查看它是 FAT 还是 NTFS,但这仍然不能告诉您它是由 C# 编写的...