首页 > 解决方案 > 在 C# 中以编程方式生成的 gz 文件与手动生成的文件不同

问题描述

我正在分析属于应用程序的文件库,该应用程序 gz-compress 并向上传到它的每个文件添加自定义标头。

标头是由标头起始元素组成的 ASCII 文本,包含压缩文件的 sha-1 校验和以及在标头结尾元素之前解压缩文件的长度。

我可以通过删除标题(通常约为 65 字节)手动解压文件,保存文件,然后使用 7-zip、gunzip 和类似工具解压缩。如果我检查生成的 gz 文件的哈希值和解压缩文件的长度,则所有内容都与存储在标头中的预期哈希值和长度相匹配。

如果我以编程方式执行相同的操作,我会得到奇怪的结果。我希望 gz 文件和解压缩文件与手动解压缩文件具有相同的哈希和长度,但事实并非如此。下面代码生成的 gz 文件比手动处理的文件大约 700 字节,不用说哈希不匹配。解压后的文件(图像)在视觉上与手动解压后的文件相同,长度完全相同,但哈希值不同。

在 7-zip 中打开两个 gz 文件会显示以下内容: 左侧是手动处理的文件,右侧是编程处理的文件。

左边的文件是我手动处理的gz文件。正确的是以编程方式完成的,并声称(非常相同的)图像是 2.4GB。我在某处做错了什么,或者这是“设计的”?

    static void Main(string[] args)
{
    string TempDir = @"c:\temp\so\";

    string file = "../../../SampleFiles/SPO_6c5af66f-0a8b-4b27-848b-7e19346ee6c7.jpg";
    FileInfo myFile = new FileInfo(file);

    List<byte> fileContents = new List<byte>();

    using (FileStream fs = myFile.OpenRead())
    {
        int bytesToRead = 1024;
        int fileLength = Convert.ToInt32(fs.Length);

        Byte[] tmpData = new Byte[bytesToRead];

        if (fileLength < bytesToRead) {
            bytesToRead = Convert.ToInt32(fileLength);
        }

        int numRead = fs.Read(tmpData, 0, bytesToRead);

        while (numRead > 0 || fileLength > 0)
        {
            fileContents.AddRange(tmpData);
            numRead = fs.Read(tmpData, 0, bytesToRead);

            fileLength -= bytesToRead;

            if (fileLength < bytesToRead)
            {
                bytesToRead = fileLength;
            }
        }

        var gzdata = fileContents.Skip(66).ToArray<byte>();

        var compressedStream = new MemoryStream(gzdata);
        var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress);
        var resultStream = new MemoryStream();

        zipStream.CopyTo(resultStream);
        var resArray = resultStream.ToArray();

        compressedStream.Flush();

        File.WriteAllBytes(TempDir + "testfile.jpg.gz", gzdata);
        File.WriteAllBytes(TempDir + "testfile.jpg", resultStream.ToArray());

    }
}

标签: c#filestreammemorystreamgzipgzipstream

解决方案


推荐阅读