问题标签 [bzip2]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
5325 浏览

performance - 最快的 bzip2 解压器是什么?

bzip2的哪个实现解压速度最快?

有一个http://bitbucket.org/james_taylor/seek-bzip2/src/tip/micro-bunzip.c声称

Manuel Novoa III (mjn3@codepoet.org) 的大小和速度优化。更有效地读取霍夫曼代码、简化的 read_bunzip() 函数以及各种其他调整。在(有限的)测试中,在 x86 上比 bzcat 快约 20%,在 arm 上快约 10%。请注意,大约 2/3 的时间用于 read_unzip() 反转 Burrows-Wheeler 转换。大部分时间是由于缓存未命中导致的延迟。

许多缓存未命中有机会通过某些技术进行优化,因此更快的实现是可能的。

这个(seek-bzip2)还有一个有趣的功能,即在输入文件中轻松搜索。

我的程序将消耗 bzip2 的输出,并且(理论上)可以在文件的不同部分并行执行此操作。因此,也考虑了并行 bzip2 实现。

谢谢。

0 投票
2 回答
644 浏览

optimization - 用于 x86 和 +1 移位的快速 memmove(用于移动到前端变换)

对于快速 MTF(http://en.wikipedia.org/wiki/Move-to-front_transform),我需要更快的版本将 char 从数组内部移动到它的前面:

cachegrind 显示,对于 memmove,这里有很多分支错误预测。

对于其他版本的代码(不是第一个示例中的 memmove,而是这个)

有很多字节读取/写入、条件分支和分支错误预测

i 不是很大,因为它是用于“良好”输入的 MTF - BWT 之后的文本文件(Burrows–Wheeler 变换)

编译器是 GCC。

0 投票
2 回答
613 浏览

mercurial - Mercurial Web Server - 为什么我下载的是 .bz2.tar 文件而不是 .tar.bz2 文件?

我的理解是 .tar 文件包含目录和其他文件,而 .bz2 是使用 bzip2 压缩压缩的文件。

因此,大多数使用 bzip2 压缩的 tarball 都以:

这是应用于 tarball 的 bzip2 压缩。

但是,每当我从 Mercurial 网络服务器下载源代码时,您可以从内部获取源代码:

或者从 BitBucket,我得到一些以

这对我来说没有意义,因为你不能对多个文件应用 bzip2 压缩,这就是为什么你需要先“tar”它们。

这是 Mercurial 中的错误吗?或者这是我的网络浏览器中的一个错误(我在 Windows 中尝试过 Google Chrome,在 Ubuntu 中尝试过 Firefox)?还是这很奇怪但没有什么不同?

我下载的最新资源来自http://bitbucket.org/bos/hgbook,它是 Mercurial 书的存储库。

0 投票
4 回答
1651 浏览

python - 压缩编解码器如何在 Python 中工作?

我正在查询数据库并使用 Python 归档结果,并且在将数据写入日志文件时尝试压缩数据。不过,我遇到了一些问题。

我的代码如下所示:

但是,我的输出文件的大小为 1,409,780。bunzip2在该文件上运行会产生一个大小为 943,634 的文件,在该文件上运行bzip2会产生一个大小为 217,275 的文件。换句话说,未压缩的文件比使用 Python 的 bzip 编解码器压缩的文件要小得多。 除了在命令行上运行之外,有没有办法解决这个问题?bzip2

我尝试了 Python 的 gzip 编解码器(将行更改为codecs.open(archive_file, 'a+', 'zip')),看看它是否解决了问题。我仍然得到大文件,但是gzip: archive_file: not in gzip format当我尝试解压缩文件时也出现错误。 那里发生了什么事?


编辑:我最初以附加模式打开文件,而不是写入模式。虽然这可能是也可能不是问题,但如果文件以“w”模式打开,问题仍然存在。

0 投票
1 回答
4503 浏览

c - 如何使用 C 从 bzip2 存档中提取所有数据?

我有一个由一些bzip2档案组成的串联文件。我也知道该文件中各个bzip2块的大小。

我想bzip2从单个 bzip2 数据块中解压缩流,并将输出写入标准输出。

首先,我使用fseek将文件光标移动到所需的存档字节,然后将文件的“大小”块读取到BZ2_bzRead调用中:

问题是,当我将fprintf语句的输出与bzip2在命令行上运行的输出进行比较时,我得到了两个不同的答案。

bzip2具体来说,与在命令行上运行相比,我从这段代码中获得的输出更少。

更具体地说,此代码的输出是命令行进程输出的较小子集,并且我缺少感兴趣的 bzip2 块尾部的内容。

我已经通过另一种技术验证了命令行bzip2提供了正确的答案,因此,我的 C 代码的一些问题导致块末尾的输出丢失。我只是不知道那个问题是什么。

如果您熟悉bzip2or libbzip2,您能否就我在上面的代码示例中做错了什么提供任何建议?感谢您的意见。

0 投票
4 回答
337 浏览

c - 如何处理基于 C 的应用程序内部的数据流?

我正在从bzip2C 应用程序中的流中提取数据。随着数据块从解压缩器中出来,它们可以被写入stdout

这很好用。当它被发送到时,我得到了所有的数据stdout

我不想写信给stdout,而是想在内部以单行块处理此语句的输出:一个以换行符结尾的字符串\n

我是否将解压缩器流的输出写入另一个缓冲区,一次一个字符,直到遇到换行符,然后调用每行处理函数?这很慢吗?有更聪明的方法吗?谢谢你的建议。

编辑

感谢您的建议。每次我通过输出缓冲区的数据时,我最终创建了一对缓冲区,将剩余部分(输出缓冲区末尾的“存根”)存储在短行缓冲区的开头。

我逐个字符地循环输出缓冲区并一次处理换行符的数据。无换行符的剩余部分被分配和分配,并复制到下一个流的行缓冲区。似乎realloc比重复malloc-free声明更便宜。

这是我想出的代码:

我真的很感谢大家的帮助。这工作得很好。

0 投票
1 回答
131 浏览

php - PHP:我不认为我可以重新编译 PHP,我应该怎么做才能使用 bzip2 库?

我在共享主机上,我注意到 PHP 不包含 bzip2。看来我必须重新编译 PHP 才能使用它。我认为共享主机不允许这样做,那么我的情况或 bzip2 有什么替代方案吗?

0 投票
2 回答
4491 浏览

java - Java:Bzip2 库

我需要创建 Bzip2 存档。从“Apache ant”下载的 bzip2 库。

(我没有找到任何如何使用它的示例,所以我决定以这种方式使用它)

但它会在磁盘上创建一个损坏的存档。

0 投票
1 回答
304 浏览

c - 帮助在 Windows 上编译 seek-bzip2

我无法在 Windows 下编译 James Taylor 出色的小“seek-bzip2”?它可以索引 bzip2 存档,然后使用该索引提供对存档各个块的随机访问。

它是用 C 编写的,需要 64 位长的 long,可在此处获得:http: //bitbucket.org/james_taylor/seek-bzip2

我无法让它在任何免费的 Windows C 编译器上编译。

  • Borland 没有一些必需的头文件。
  • lcc 编译它,但它在任何 bzip2 文件上都因“意外 EOF”而失败。
  • 如果您删除“-m64”标志,mingw 将编译它,但它会以与上述 lcc 相同的方式失败。

免费的编译器似乎没有很好的调试支持,MS Visual Studio 拒绝安装在我的可移动硬盘上,而且我的上网本的 C 和 D 驱动器没有足够的空间。


编辑自从我要求某人为我移植它以来,我已经改写了这个问题,但我很高兴自己尝试移植它。我只是不知道从哪里开始。自从 64 位类型变得普遍之前,我就没有接触过 C。

0 投票
2 回答
5385 浏览

python - 在 Python 中计算/验证 bz2 (bzip2) CRC32

我正在尝试计算/验证压缩 bzip2 档案的 CRC32 校验和。

http://en.wikipedia.org/wiki/Bzip2

所以我知道 CRC 校验和在 bz2 文件中的位置,但我将如何验证它们。我应该binascii.crc32()获得哪些 CRC?我已经尝试逐字节计算各种块的 CRC,但没有设法得到匹配。

谢谢你。我将研究 bzip2 源代码和bz2Python 库代码,可能会找到一些东西,尤其是在decompress()方法中。

更新1:

据我所知,块头由以下标签标识。但是微小的 bz2 文件不包含 ENDMARK 文件。(感谢adw,我们发现应该寻找 ENDMARK 的位移位值,因为压缩数据没有填充到字节。)

这是从bzlib2recover.c源头开始的,块似乎总是从第 80 位开始,就在 CRC 校验和之前,应该从 CRC 计算中省略,因为不能将自己的 CRC CRC 为相同的 CRC(你明白我的意思) .

查看计算这个的代码。

更新 2:

bzlib2recover.c没有CRC计算功能,它只是从损坏的文件中复制CRC。但是,我确实设法在 Python 中复制了块计算器功能,以标记bz2压缩文件中每个块的开始和结束位。回到正轨,我发现它compress.c指的是bzlib_private.h.

这些定义也被访问bzlib.cs->blockCRC在 中初始化和更新,在 中bzlib.c完成compress.c。有超过 2000 行 C 代码,这需要一些时间来查看并弄清楚哪些内容可以输入,哪些内容不可以。我也将C标签添加到问题中。

顺便说一下,这里是 bzip2 的 C 源代码http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz

更新 3:

原来bzlib2块 CRC32 是使用以下算法计算的:

dataIn是要编码的数据。

其中 BZ2_crc32Table 定义在crctable.c

对于dataIn = "justatest"返回的 CRC 7948C8CB,使用该数据压缩文本文件后,bz2 文件中的 crc:32 校验和79 48 c8 cb是匹配的。

结论:

bzlib2 CRC32 是(引用crctable.c

由 Rob Warnock 在 comp.compression FAQ 的第 51 节中模糊地派生出来...

...因此,据我了解,不能使用标准 CRC32 校验和计算器预先计算/验证,而是需要bz2lib实现(第 155-172 行bzlib_private.h)。