2012-06-23 8 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 이미지.

내가하려는 것은 PDF의 LZWDecode 방법에 필요한 길이와 일치하도록 LZW 코드를 채우는 것입니다.

LZWDecode 이미지의의 색상에 <Clear> 코드가 256이며 <End> 코드는 5 비트 이미지의 경우 (44 페이지 PDF Reference)

257 인 8 비트 이미지 코드 0-31지도 기대 <Clear>이 32이고 <End>이 33입니다.

코드 0-31은 그대로 유지되지만 32+는 256-32로 오프셋되도록 비트 스트림을 다시 채워야합니다.

Windows 용 ActiveState Perl을 사용하고 있습니다.

+0

도움이되었습니다. 당신이 추가 한 것에서 우리는 필드가 비트 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