【发布时间】:2012-06-23 01:54:17
【问题描述】:
在 Perl 中修改后如何将位重新打包到位流中?
我目前正在使用以下解包:
my $bits = 5;
my $code = '';
foreach my $i (reverse 0..$bits-1) {
$code <<= 1;
$code |= vec($data,$i,1);
}
例如,输出可能是 16。
编辑:
这道题与GIF图片的数据块有关。
我要做的是填充 LZW 代码以匹配 PDF 的 LZWDecode 方法所需的长度。
LZWDecode 需要 8 位图像,其中 <Clear> 代码为 256,<End> 代码为 257(PDF Reference,第 44 页。)
对于 5 位图像,代码 0-31 映射到图像全局颜色表中的颜色,<Clear> 是 32,<End> 是 33。
所以我需要重新打包比特流,使代码 0-31 保持不变,但 32+ 偏移 256-32。
我正在为 Windows 使用 ActiveState Perl。
【问题讨论】:
-
确实有帮助。根据您添加的内容,我们可以推断该字段并不总是从零位开始,我们可以推断您不想破坏字节中的其他位。它还告诉我们,即使您当前正在读取 5 位,您也想一次读取 8 位。最后,它告诉我们您想要操作整个字段序列(不仅仅是一个),并且您不需要处理任意字段大小。但它并没有告诉我们如何处理填充。你怎么处理剩下的部分?
标签: perl pdf bit-manipulation lzw bitstream