题
我创建的东西,包括各种各样的文件上传服务,我需要存储与zlib的的压缩()函数压缩数据。我把它整个已经压缩了互联网,但我需要知道在远程服务器上的未压缩的文件大小。有什么办法,我可以找出没有解压(这些信息)荷兰国际集团的数据在服务器上的第一次,只是为了提高效率?这就是我现在怎么做,但如果有一个快捷方式我很乐意接受它。
顺便说一句,为什么叫解压?这听起来很可怕,我一直以为这将是解...
解决方案
zlib数据格式不具有原始输入大小的字段,所以我怀疑,你将能够做到这一点,而不模拟数据的解压缩。的 gzip格式具有 “输入大小”(ISIZE
)现场,你可以使用,但也许你想避免更改压缩格式或具有客户端发送的文件的大小。
但是,即使你使用不同的格式,如果你不信任的客户,你仍然需要运行一个更昂贵的检查,以确保未压缩数据是大小客户说,这是。在这种情况下,你可以做的是使的解压缩-TO-的/ dev / null的的工艺成本更低,确保zlib的任何地方都不会写的输出数据,因为你只是想知道未压缩的大小。
其他提示
我怀疑。我不相信这是后话了底层的zlib库从内存中提供(尽管它一直以来我用它一个很好的7或8年,似乎向上的最新文档不以表示此功能已被添加)。
一种可能性是转让其包含的未压缩的大小(例如,转让双方file.zip
和file.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文件,它包含一个目录,它告诉你的文件的大小时,它的压缩。该信息被内置到文件格式,再次,虽然这是受到恶意客户端。