2

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<Clear>は、コードが 256 で<End>コードが 257の8 ビット イメージを予期します ( 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 に答える