Perl,解码存储在二进制文件中的位

时间:2014-08-26 10:05:07

标签: perl binary bit-manipulation

我在perl中解码固定宽度的二进制文件。其中一个字段长度为1个字节,8个字节编码为:

  

第7位未使用,0-4位用于指示Field1。第5-6位用于表示Field2。

例如,字段0x27会给Field1 = 7,Field2 = 1

我将所有字段读入名为raw{}的哈希表中,然后将值解码为另一个名为processed{}的哈希值。

代码(仅显示此一个字节)是

while (read(FILE, $buff, 559)) {
  %raw = ();            # Hash for first-pass extractions
  %processed = ();      # Hash for cleaned up values, for output

  (
    ......
    $raw{'Field12'},
    ......
  )= unpack('
             .....
             H2
             .....
             h*',$buff);

$prcoessed{'Field1'} = unpack("B8", pack("H8", $raw{'Field12'})) & 0x1f;
$prcoessed{'Field2'} = (unpack("B8", pack("H8", $raw{'Field12'})) >> 5) & 0x3;

但是,我没有得到所需的值。我得到$prcoessed{'Field1'} = 15$prcoessed{'Field2'} = 3。我哪里错了?

1 个答案:

答案 0 :(得分:1)

0x1f是一个数字,您需要将其转换为字符。

您可以使用ordchr代替包和解包:

#!/usr/bin/perl
use warnings;
use strict;

my $char = chr 0x27;

my $field1 = $char & chr 0x1f;

my $field2 = $char & chr 0x60;
$field2 = chr(ord($field2) >> 5);

print ord, "\n" for $field1, $field2;

使用packunpack的相同脚本:

my $char = pack 'C', 0x27;

my $field1 = $char & pack 'C', 0x1f;

my $field2 = $char & pack 'C', 0x60;
$field2 = pack 'C', unpack('C', $field2) >> 5;

print unpack('C', $_), "\n" for $field1, $field2;