使用BCL进行文件压缩

时间:2018-04-30 07:56:05

标签: c++ compression

4.5 Huffman_Compress

Syntax:

outsize = Huffman_Compress(in,out,insize)

outsize Size of output buffer after compression
in Pointer to the input buffer (uncompressed data)
out Pointer to the output buffer (compressed data)
insize Size of input buffer
The output buffer must be able to hold insize * 101 / 100 + 320 bytes.

4.6 Huffman_Uncompress 语法:

Huffman_Uncompress(IN,OUT,INSIZE,特大)

in Pointer to the input buffer (compressed data)
out Pointer to the output buffer (uncompressed data)
insize Size of input buffer
outsize Size of output buffer
The output buffer must be able to hold outsize bytes

应该使用多大的输出缓冲区?我试图找到一些例子但没有找到任何内容

2 个答案:

答案 0 :(得分:2)

看起来您的图书馆只根据您发布的内容处理内存数据。它可能能够执行基于文件的数据,但这与您提供的数据完全不同。

因此,您可能需要执行以下操作:

  • 将文件读入内存缓冲区;
  • 分配另一个(压缩的)缓冲区,增加1%,额外320字节;
  • 调用该函数将普通内存缓冲区转换为压缩缓冲区;
  • 将压缩缓冲区写入另一个文件(写入量取决于函数返回的outsize)。

如果您希望能够处理任意大小的输入文件而不必担心缓冲区内存不足的可能性,那么您可以" chunk up"输入(例如)64,569字节块。

这将需要一个64,569字节的输入缓冲区,一个65,535字节的输出缓冲区(64,569 * 1.01 + 320,向上舍入),以及一种存储这些块的方法,以便您可以单独获取它们进行解压缩。

例如,您可能需要编写无符号的16位outsize(您现在可以看到为什么我选择64,569的输入大小以便将outsize限制为16位值)通过那么多字节的数据,为你做的每一个块。

由于您定期重新启动Huffman树,压缩可能会少一点,但它应该合理地接近您一次性完成整个文件时的结果。

答案 1 :(得分:2)

有关Huffman_Compress的更多信息,可以确定最大压缩比和开销。有了它,您可以计算由于解压缩而产生的最大可能扩展,并相应地分配输出缓冲区。但是你不会喜欢大压缩输入的答案。

由于似乎需要在一次调用中完成解压缩,因此您应该使用压缩数据发送未压缩长度。简单地将压缩数据前置,例如,包含未压缩长度的八个字节。另一方面,读取8字节长度,分配该大小的缓冲区,并将余数解压缩到该缓冲区中。