我创建的东西,包括各种各样的文件上传服务,我需要存储与zlib的的压缩()函数压缩数据。我把它整个已经压缩了互联网,但我需要知道在远程服务器上的未压缩的文件大小。有什么办法,我可以找出没有解压(这些信息)荷兰国际集团的数据在服务器上的第一次,只是为了提高效率?这就是我现在怎么做,但如果有一个快捷方式我很乐意接受它。

顺便说一句,为什么叫解压?这听起来很可怕,我一直以为这将是解...

有帮助吗?

解决方案

zlib数据格式不具有原始输入大小的字段,所以我怀疑,你将能够做到这一点,而不模拟数据的解压缩。的 gzip格式具有 “输入大小”(ISIZE)现场,你可以使用,但也许你想避免更改压缩格式或具有客户端发送的文件的大小。

但是,即使你使用不同的格式,如果你不信任的客户,你仍然需要运行一个更昂贵的检查,以确保未压缩数据是大小客户说,这是。在这种情况下,你可以做的是使的解压缩-TO-的/ dev / null的的工艺成本更低,确保zlib的任何地方都不会写的输出数据,因为你只是想知道未压缩的大小。

其他提示

我怀疑。我不相信这是后话了底层的zlib库从内存中提供(尽管它一直以来我用它一个很好的7或8年,似乎向上的最新文档不以表示此功能已被添加)。

一种可能性是转让其包含的未压缩的大小(例如,转让双方file.zipfile.zip.size)另一个文件,但似乎充满了危险,特别是如果你的大小是错误的。

另一种选择是,如果服务器解压是费时的,但不必须被立即进行,这样做在一个低优先级的后台任务(例如在Linux下nice)。但同样,有可能是缺点,如果大小检查开始运行的背后(太多上传进来)。

我倾向于在“爆炸减压”方面想减压,而不是一个好词,来使用: - )

如果您使用的是原始“压缩”格式上传,那么你不会有,就会向被上传的数据的大小的信息。大同在这方面是正确的。结果 你可以把它保存为在压缩缓冲区开始一个4字节的头 - 假设文件大小不超过4GB的结果 一些C代码的示例:

 uint8_t *compressBuffer = calloc(bufsize + sizeof (uLongf), 0);
 uLongf compressedSize = bufsize;
 *((uLongf *)compressBuffer) = filesize;
 compress(compressBuffer + sizeof (uLongf), &compressedSize, sourceBuffer, bufsize);

然后,你发送大小compressedSize +的sizeof(uLongf)的完整compressBuffer。当您收到它在服务器端,您可以使用下面的代码来取回数据:

 // data is in compressBuffer, assume you already know compressed size.
 uLongf originalSize = *((uLongf *)compressBuffer);
 uint8_t *realCompressBuffer = compressBuffer + sizeof (uLongf);

如果您不信任的客户端发送正确的尺寸,那么你将需要进行某种形式的服务器上的大小非压缩数据检查。使用解压缩到/ dev / null的的建议是合理的。结果 如果您上传的.zip文件,它包含一个目录,它告诉你的文件的大小时,它的压缩。该信息被内置到文件格式,再次,虽然这是受到恶意客户端。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top