【问题标题】:Use Perl to Modify a Bitstream使用 Perl 修改比特流
【发布时间】:2012-06-23 01:54:17
【问题描述】:

在 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 位图像,其中 &lt;Clear&gt; 代码为 256,&lt;End&gt; 代码为 257(PDF Reference,第 44 页。)

对于 5 位图像,代码 0-31 映射到图像全局颜色表中的颜色,&lt;Clear&gt; 是 32,&lt;End&gt; 是 33。

所以我需要重新打包比特流,使代码 0-31 保持不变,但 32+ 偏移 256-32。

我正在为 Windows 使用 ActiveState Perl。

【问题讨论】:

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

标签: perl pdf bit-manipulation lzw bitstream


【解决方案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);

【讨论】:

  • 感谢 ikegami 的持续反馈。根据我提供的信息,我已将此标记为已回答,但实际上并不能满足我的需求。我已经开始new thread,希望能更好地表达我的目标,如果您能提供一些 cmets,我将不胜感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 2013-08-10
相关资源
最近更新 更多