假设我有一个 bzip2 文件(超过 5GB),我只想解压缩块 #x,因为我的数据在哪里(块每次都不同)。我该怎么做?
我考虑过对所有块的位置进行索引,然后从文件中剪切我需要的块并将 bzip2recover 应用于它。
我还考虑过一次压缩 1MB,然后将其附加到文件中(并记录位置),并在需要时简单地抓取文件,但我宁愿保持原始 bzip2 文件完好无损。
我的首选语言是 Ruby,但任何语言的解决方案我都可以(只要我了解原理)。
假设我有一个 bzip2 文件(超过 5GB),我只想解压缩块 #x,因为我的数据在哪里(块每次都不同)。我该怎么做?
我考虑过对所有块的位置进行索引,然后从文件中剪切我需要的块并将 bzip2recover 应用于它。
我还考虑过一次压缩 1MB,然后将其附加到文件中(并记录位置),并在需要时简单地抓取文件,但我宁愿保持原始 bzip2 文件完好无损。
我的首选语言是 Ruby,但任何语言的解决方案我都可以(只要我了解原理)。
有一个http://bitbucket.org/james_taylor/seek-bzip2
获取源代码,编译它。
运行
./seek-bzip2 32 < bzip_compressed.bz2
去测试。
唯一的参数是奇怪的块头的位位移。您可以通过在二进制文件中找到“31 41 59 26 53 59”十六进制字符串来获取它。这是不正确的。块开始可能未与字节边界对齐,因此您应该搜索“31 41 59 26 53 59”十六进制字符串的每个可能的位移,就像在 bzip2recover - http://www.bzip.org/1.0 中所做的那样。 3/html/recovering.html
32 是“BZh1”标头的位大小,其中 1 可以是从“1”到“9”的任何数字(在经典 bzip2 中)——它是数百 kb 的(未压缩)块大小(不精确)。
确实 bzip-table 几乎与解压缩一样慢,但当然您只需执行一次,您可以以某种方式存储输出以用作索引。这非常适合我的需要,但可能不是每个人都需要的。
我确实需要一点帮助才能让它在 Windows 上编译。