当使用zlib对c中的文件进行压缩时,对其进行解压缩

本文关键字:压缩 解压缩 zlib 文件 | 更新日期: 2023-09-27 18:28:43

zlib是一个用visual c++编写的应用程序,可在线使用。

我有一个在visualstudioc++应用程序中使用zlib压缩的文件。现在我正在尝试编写一个完全不同的c#程序,以便在visual c#应用程序中对其进行解压缩。我所做的是:

  1. 我有一个扩展名为.fdd的大文件,其中包含3个压缩(使用zlib)文件(ffo、sym和cff)。

  2. 起初,我将整个.fdd文件转换为一个字节数组。

  3. 我找到了这三个文件的确切位置。

  4. 使用循环,将文件的各个字节复制到另一个数组中。因此,在第一次迭代中,数组存储ffo字节,在第二次迭代中存储sym字节,依此类推

  5. 将复制的字节数组转换为一个扩展名为.zip的文件,这样我就可以分离出3个压缩文件。

  6. 所以我将这些文件命名为Fileffo.zip、Filesym.zip和Filecff.zip.

  7. 现在我需要解压缩文件,并将解压缩的文件命名为p.ffo、Q.sym和R.cff.

  8. 我只知道.fdd文件已经使用gzip实用程序进行了压缩。前四个字节包含ffo文件的大小,从第五个字节到ffo存在的大小(从前四个字节开始),在ffo之后,接下来的四个字节包含sym文件的大小然后是sym文件,接下来的4个字节包含cff文件的大小再然后是cff文件本身。这就是为什么我试图从它们之前的四个字节中提取相应文件的大小。然后尝试通过循环将三个文件中的字节信息分别保存在数组中。

如何使用c#解压缩它们?我不知道使用"zlib"压缩文件时使用的确切扩展名,所以我使用了.zip扩展名。

public static void ExtractFile()
{
    int i = 0;
    const string zipPath = @"C:'Product Development'Development'FFPCAppTool'PCToolForFF'PCToolForFF'bin'x86'Debug'000A1C10000101.fdd";
    if (zipPath.Contains("000A1C10000101.fdd"))
    {
        byte[] arrayWholeFileInBytes = File.ReadAllBytes(zipPath);
        long fileLength = new FileInfo(zipPath).Length;
        //string testpath = @"C:'Product Development'Development'ExtractedFdd'" + ManuId + "''" + DeviceIdentifier + "''" + Revision + ".zip";
        const string testzippath = @"C:'Users'Himagau'Desktop'testExtract'Fileffo.zip";
        const string extractPath = @"C:'Users'Himagau'Desktop'testExtract' ";

        while (i < fileLength)
        {
            using (BinaryReader reader = new BinaryReader(new FileStream(zipPath, FileMode.Open)))
            {
                reader.BaseStream.Seek(i, SeekOrigin.Begin);
                reader.Read(arrayWholeFileInBytes, i, 4); //reading value in bytes 
                n = BitConverter.ToInt32(arrayWholeFileInBytes, i);
                //converting first four bytes into a single integer value i.e. size of zip
                reader.Read(arrayWholeFileInBytes, i + 4, n);
                byte[] array1 = new byte[n]; //passing the size of zip into array size
                Array.Copy(arrayWholeFileInBytes, i + 4, array1, 0, n);
                File.WriteAllBytes(testzippath, array1);
                ZipFile.ExtractToDirectory(testzippath, extractPath);
                i = i + n + 4;
            }
        }
    }
}

zipfile&zip存档会给出类似central directory not found的错误,当文件扩展名从.zip更改为.gz时,gzipstream会给出"不是有效的gzip文件"的错误。

当使用zlib对c中的文件进行压缩时,对其进行解压缩

给定以下注释中提供的前几个字节的示例E7 6B 00 00 78 9C EC BD 07 7C 1C C9 75 26 DE 35 33 C0 00 20 72 06 08 22 31 81 39 67 2E D3,以78 9C开头的字节是zlib流。不是拉链。不是gzip。zlib。这是三种不同的格式。

您可以使用DotNetZip的ZlibCodec方法对其进行解压缩。