使用zlib压缩文件时,解压缩c#中的文件

时间:2014-10-31 20:12:16

标签: c# zlib compression

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

我有一个在visual studio c ++应用程序中使用zlib压缩的文件。现在我正在尝试编写一个完全不同的c#程序,在visual c#application中解压缩它。我所做的是:

  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文件,接下来的四个字节包含cff文件的大小,然后是cff文件本身。这就是为什么我试图从它们之前的相应四个字节中提取相应文件的大小。然后尝试通过循环分别在数组中保存三个文件中的字节信息。

  9. 如何使用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&amp; zip存档提供central directory not found之类的错误,当从.zip将文件扩展名更改为.gz时,gzipstream会将错误标记为&#34;而不是有效的gzip文件。&#34;

1 个答案:

答案 0 :(得分:0)

给出下面评论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方法对其进行解压缩。