2012-06-23 46 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