2012-06-23 12 views
2

如何在Perl中修改它们后将比特流重新打包成比特流?使用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

这确实有帮助。从你添加的内容中,我们可以推断出该字段并不总是从第零位开始,我们可以推断出你不想破坏字节中的其他位。它还告诉我们,即使您正在阅读5,您也想一次读取8位数据。最后,它告诉我们您想操纵整个字段序列(而不仅仅是一个字段),而且您不需要处理任意字段大小。但它并没有告诉我们如何处理填充。你对剩下的部分做了什么? – ikegami

回答

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); 
+0

谢谢ikegami,感谢您的持续反馈。根据我提供的信息,我已将此标记为已回答,但实际上并未解决我的需求。我已经开始[新线程](http://stackoverflow.com/questions/11108579/use-perl-to-add-gif-image-other-than-8-bit-to-pdf)希望更好的短语我的目标,如果你能提供一些意见,我会很感激。 – xpsd300