2012-06-23 5 views
2

Как я могу перекомпилировать биты в битовый поток после изменения их в Perl?Использование Perl для изменения битового потока

настоящее время я использую следующие распаковывать:

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

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

Например, вывод может быть 16.

EDIT:

Этот вопрос относится к блоку данных изображение 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 для Windows.

+0

Это помогло. Из того, что вы добавили, мы можем вывести, что поле не всегда начинается с нуля, и мы можем сделать вывод, что вы не хотите сбивать другие биты в байте. Он также говорит нам, что вы хотите читать 8 бит за раз, даже если вы сейчас читаете 5. Наконец, он говорит нам, что вы хотите манипулировать целой последовательностью полей (а не только одной) и что вам не нужно для обработки произвольных размеров полей. Но он не говорит нам, как обращаться с дополнением. Что вы делаете с остальными битами? – 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