压缩\解压缩二进制文件

时间:2018-05-23 13:45:06

标签: c# compression sharpziplib

我需要将* .bin文件解压缩到某个临时文件中,在我的程序中用它执行某些操作然后压缩它。有一个函数解压缩* .bin文件。即,获得了用于正确操作程序的临时文件。功能:

public void Unzlib_bin(string initial_location, string target_location)
{
    byte[] data, new_data;
    Inflater inflater;

    inflater = new Inflater(false);

    data = File.ReadAllBytes(initial_location);
    inflater.SetInput(data, 16, BitConverter.ToInt32(data, 8));
    new_data = new byte[BitConverter.ToInt32(data, 12)];
    inflater.Inflate(new_data);

    File.WriteAllBytes(target_location, new_data);
}

问题是如何将临时文件打包到其原始状态?我正在尝试做类似以下的事情,但结果是错误的:

public void Zlib_bin(byte[] data, int length, string target_location)
{
    byte[] new_data;
    Deflater deflater;
    List<byte> compress_data;

    compress_data = new List<byte>();
    new_data = new byte[length];
    deflater = new Deflater();

    compress_data.AddRange(new byte[] { ... }); //8 bytes from header, it does not matter
    deflater.SetLevel(Deflater.BEST_COMPRESSION);
    deflater.SetInput(data, 0, data.Length);
    deflater.Finish();
    deflater.Deflate(new_data);
    compress_data.AddRange(BitConverter.GetBytes(new_data.Length));
    compress_data.AddRange(BitConverter.GetBytes(data.Length));
    compress_data.AddRange(new_data);

    File.WriteAllBytes(target_location, compress_data.ToArray());
}

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

如果&#34;结果错误&#34;你的意思是你无法压缩回完全相同的字节,这完全是预期的。除非您使用完全相同的压缩代码,该代码的版本以及该代码的设置,否则无法保证解压缩然后压缩会为您提供相同的功能。

有许多压缩数据流来表示相同的未压缩数据,压缩器可以自由使用它们中的任何一个,通常是由于执行时间,使用的内存和压缩比率的权衡。这就是为什么压缩机具有&#34;级别&#34;和其他调整。

无损压缩器的唯一保证是当你压缩然后解压缩时,你得到的就是你开始使用的。

如果解压缩你得到的内容会得到相同的未压缩数据,那么一切都很好。