- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
概览
我正在使用 libbzip2
中的低级调用图书馆:BZ2_bzCompressInit()
, BZ2_bzCompress()
和 BZ2_bzCompressEnd()
将数据块压缩到标准输出。
我正在从更高级别的调用中迁移工作代码,因为我有一个字节流进来,我想将这些字节压缩为一组离散块(离散块是一组包含一组感兴趣的标记的字节)我的输入在逻辑上分为这些块的组)。
一组完整的块可能包含 500 个块,我想将其压缩为一个 bzip2 流并写入标准输出。
在一组中,使用我在下面概述的伪代码,如果我的示例缓冲区一次能够容纳 101 个块,我将打开一个新流,在 101、101、101、101 和最后一次运行中压缩 500 个块关闭流的 96 个块。
问题
问题是我的 bz_stream
结构实例,它在 BZ2_bzCompress()
的单次传递中跟踪压缩字节数例程,似乎声称写入的压缩字节数比最终压缩文件中的总字节数多。
例如,压缩输出可能是一个真实大小为 1234 字节的文件,而报告的压缩字节数(我在调试时跟踪)略高于 1234 字节(比如 2345 字节)。
我的粗略伪代码分为两部分。
第一部分是我如何压缩块子集的粗略草图(我知道在这个子集之后还有另一个子集):
bz_stream bzStream;
unsigned char bzBuffer[BZIP2_BUFFER_MAX_LENGTH] = {0};
unsigned long bzBytesWritten = 0UL;
unsigned long long cumulativeBytesWritten = 0ULL;
unsigned char myBuffer[UNCOMPRESSED_MAX_LENGTH] = {0};
size_t myBufferLength = 0;
/* initialize bzStream */
bzStream.next_in = NULL;
bzStream.avail_in = 0U;
bzStream.avail_out = 0U;
bzStream.bzalloc = NULL;
bzStream.bzfree = NULL;
bzStream.opaque = NULL;
int bzError = BZ2_bzCompressInit(&bzStream, 9, 0, 0);
/* bzError checking... */
do
{
/* read some bytes into myBuffer... */
/* compress bytes in myBuffer */
bzStream.next_in = myBuffer;
bzStream.avail_in = myBufferLength;
bzStream.next_out = bzBuffer;
bzStream.avail_out = BZIP2_BUFFER_MAX_LENGTH;
do
{
bzStream.next_out = bzBuffer;
bzStream.avail_out = BZIP2_BUFFER_MAX_LENGTH;
bzError = BZ2_bzCompress(&bzStream, BZ_RUN);
/* error checking... */
bzBytesWritten = ((unsigned long) bzStream.total_out_hi32 << 32) + bzStream.total_out_lo32;
cumulativeBytesWritten += bzBytesWritten;
/* write compressed data in bzBuffer to standard output */
fwrite(bzBuffer, 1, bzBytesWritten, stdout);
fflush(stdout);
}
while (bzError == BZ_OK);
}
while (/* while there is a non-final myBuffer full of discrete chunks left to compress... */);
/* read in the final batch of bytes into myBuffer (with a total byte size of `myBufferLength`... */
/* compress remaining myBufferLength bytes in myBuffer */
bzStream.next_in = myBuffer;
bzStream.avail_in = myBufferLength;
bzStream.next_out = bzBuffer;
bzStream.avail_out = BZIP2_BUFFER_MAX_LENGTH;
do
{
bzStream.next_out = bzBuffer;
bzStream.avail_out = BZIP2_BUFFER_MAX_LENGTH;
bzError = BZ2_bzCompress(&bzStream, (bzStream.avail_in) ? BZ_RUN : BZ_FINISH);
/* bzError error checking... */
/* increment cumulativeBytesWritten by `bz_stream` struct `total_out_*` members */
bzBytesWritten = ((unsigned long) bzStream.total_out_hi32 << 32) + bzStream.total_out_lo32;
cumulativeBytesWritten += bzBytesWritten;
/* write compressed data in bzBuffer to standard output */
fwrite(bzBuffer, 1, bzBytesWritten, stdout);
fflush(stdout);
}
while (bzError != BZ_STREAM_END);
/* close stream */
bzError = BZ2_bzCompressEnd(&bzStream);
/* bzError checking... */
cumulativeBytesWritten
(或者,特别是 bzBytesWritten
)不正确,我该如何解决? bzBytesWritten
值(value)。该值被计数并使用一次以递增
cumulativeBytesWritten
每次成功后
BZ2_bzCompress()
经过。
bz_stream
的正确用法?州旗? bzError = BZ2_bzCompress(&bzStream, BZ_RUN);
bzStream.next_in
访问指针(
BZ_RUN
),然后当没有更多可用字节(
BZ_FINISH
)时流被包裹?
bzError = BZ2_bzCompress(&bzStream, (bzStream.avail_in) ? BZ_RUN : BZ_FINISH);
最佳答案
在回答我自己的问题时,我似乎错误计算了写入的字节数。我不应该使用 total_out_*
成员。以下更正工作正常:
bzBytesWritten = sizeof(bzBuffer) - bzStream.avail_out;
关于c - 使用 bzip2 低级例程压缩数据 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13065023/
为了直接以bz2格式转储数据库,我尝试使用管道直接压缩转储文件,如下: mysqldump -u userName -p myDataBase | bzip2 -c > myDump.sql.bz2
首先是一些代码: ByteArrayOutputStream bos = new ByteArrayOutputStream(); CBZip2OutputStream zos = new CBZip
我想使用 tee 命令将 bzip 命令的 stdop 重定向到日志文件,但它不起作用并且在 tee 命令中为“-a”给出错误。请查看下面的错误, > bzip2 file -c 1> tee -a
我的项目使用的是带有 bzip2 的 Boost iostream 的旧版本。我现在正在尝试升级到 Boost 1.51。起初我没有用 bzip 编译,所以很明显我让链接器大喊 libboost_bz
有什么方法可以压缩 GZip、BZip、BZip2、xz 格式的目录。我正在构建一个命令行工具(使用 bash),我需要包含这些选项。 最佳答案 像这样的命令 tar czf output.tar.g
我通过在 Scala 中进行 Python 挑战系列来惩罚自己。 现在,挑战之一是读取使用 bzip 算法压缩的字符串并输出结果。 BZh91AY&SYA\xaf\x82\r\x00\x00\x01\
我在S3中有大约200个文件,例如a_file.json.bz2,这些文件的每一行都是JSON格式的记录,但有些字段是由pickle.dumps,例如一个日期时间字段。 bzip 压缩后每个文件约 1
我在S3中有大约200个文件,例如a_file.json.bz2,这些文件的每一行都是JSON格式的记录,但有些字段是由pickle.dumps,例如一个日期时间字段。 bzip 压缩后每个文件约 1
我一直在致力于从不同类型的文件格式(例如“zip,tar,tbz,tgz”)解压缩的任务。我能够为除 tbz 之外的所有内容执行此操作,因为 apache common compress 库提供了 B
我尝试通过 phpmyadmin 导出我的数据库,我可以在没有任何压缩的情况下导出它,但是当我选择任何类型的压缩(例如 gzip、bzip 或 zip)时,它最终会出现网络错误(Chrome),源文件
我是一名优秀的程序员,十分优秀!