Compressing\decompressing 个二进制文件
Compressing\decompressing binary files
我需要将*.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());
}
有什么想法吗?
如果 "the result is wrong" 你的意思是你不能压缩回完全相同的字节,那是完全可以预料的。不能保证先解压再压缩会得到相同的结果,除非您使用完全相同的压缩代码、该代码的版本和该代码的设置。
有许多压缩数据流来表示相同的未压缩数据,压缩器可以自由使用其中的任何一个,通常是由于在执行时间、使用的内存和压缩率方面的权衡。这就是压缩器有 "levels" 和其他调整的原因。
无损压缩器的唯一保证是,当您压缩然后解压缩时,您得到的正是您开始时的内容。
如果解压得到的数据是相同的未压缩数据,那么一切都很好。
我需要将*.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());
}
有什么想法吗?
如果 "the result is wrong" 你的意思是你不能压缩回完全相同的字节,那是完全可以预料的。不能保证先解压再压缩会得到相同的结果,除非您使用完全相同的压缩代码、该代码的版本和该代码的设置。
有许多压缩数据流来表示相同的未压缩数据,压缩器可以自由使用其中的任何一个,通常是由于在执行时间、使用的内存和压缩率方面的权衡。这就是压缩器有 "levels" 和其他调整的原因。
无损压缩器的唯一保证是,当您压缩然后解压缩时,您得到的正是您开始时的内容。
如果解压得到的数据是相同的未压缩数据,那么一切都很好。