2012-05-09 95 views
2

我不确定描述这种情况的最佳方法。在Perl中将位向量转换为二进制文件

本质上,我试图写入需要某个协议的缓冲区。我想要的前两个字节是“10000001”和“11111110”(逐位)。我如何将这两个字节写入Perl中的文件句柄?

回答

4

要拼写出二进制转换成实际的字节,你想要的pack函数或者Bb(根据订单你在位):

print FILE pack('B*', '1000000111111110'); 

但是,如果字节是恒定的,则最好将它们转换为十六进制值并使用\x以字符串文字转义:

print FILE "\x81\xFE"; 
1

如何

# open my $fh, ... 
print $fh "\x81\xFE"; # 10000001 and 11111110 
1

由于版本5.6.0(2000年3月发行),Perl有支持binary literals作为记录在perldata

数字文本在以下任何浮点或整数格式指定

12345 
12345.67 
.23E-10  # a very small number 
3.14_15_92  # a very important number 
4_294_967_296 # underscore for legibility 
0xff   # hex 
0xdead_beef # more hex 
0377   # octal (only numbers, begins with 0) 
0b011011  # binary 

您可以在数字之间使用数字字母的下划线(下划线)以显示易读性。例如,您可以按三分组对二进制数字进行分组(例如,对于诸如0b110_100_100的Unix样式模式参数)或通过四(用于表示半字节,如在0b1010_0110中)或在其他组中进行分组。

你可能会被写入

print $fh 0b10000001, 0b11111110; 

但输出将

129254

因为10000001₂=129₁₀和11111110₂=254₁₀。

你想要一个特定表示文字的值,即作为两个无符号字节。为此,使用pack,其模板为"C2",,即,八位组时间二。添加下划线的可读性和便利子程序包它给

sub write_marker { 
    my($fh) = @_; 
    print $fh pack "C2", 0b1000_0001, 0b1111_1110; 
} 

作为一个快速演示,考虑

binmode STDOUT or die "$0: binmode: $!\n"; # we'll send binary data 
write_marker *STDOUT; 

当作为

运行
$ ./marker-demo | od -t x1

输出

0000000 81 fe 
0000002

如果它是不熟悉的,od实用程序在这里用于表示目的,因为输出包含控制字符和Þ(拉丁小刺)在我的系统的编码。

上面的调用命令OD以十六进制从它的输入,这是标记演示的输出每个字节渲染。注意10000001 2 = 81 16和11111110 2 = FE 16。左列中的数字是偏移量:特殊标记字节从偏移量零开始(即,立即),并且恰好有两个。

相关问题