我在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
。我哪里错了?
答案 0 :(得分:1)
0x1f
是一个数字,您需要将其转换为字符。
#!/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;
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;