2

在 Perl 中修改比特后,如何将比特重新打包到比特流中?

我目前正在使用以下内容来解包:

my $bits = 5;
my $code = '';

foreach my $i (reverse 0..$bits-1) {
    $code <<= 1;
    $code  |= vec($data,$i,1);
}

例如,输出可能是 16。

编辑:

这个问题与GIF图像的数据块有关。

我要做的是填充 LZW 代码以匹配 PDFLZWDecode方法所需的长度。

LZWDecode需要 8 位图像,其中<Clear>代码为 256,<End>代码为 257(PDF 参考,第 44 页。)

对于 5 位图像,代码 0-31 映射到图像全局颜色表中的颜色,分别<Clear>为 32 和<End>33。

所以我需要重新打包比特流,使代码 0-31 保持不变,但 32+ 偏移 256-32。

我正在为 Windows 使用 ActiveState Perl。

4

1 回答 1

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);
于 2012-06-26T18:00:25.310 回答