如何在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。
我正在使用ActiveState Perl for Windows。
答案 0 :(得分:1)
# Unpack from 8 bit fields.
my @vals = unpack('C*', $bytes);
... transform @vals into 5 bit values here ...
# Pack to 5 bit fields.
my $bits = join '', map substr(pack('B*', $val), -5), @vals;
$bits .= '0' x (-length($bits) % 8); # Pad with zeros to byte boundary
$bytes = pack('B*', $bits);