我不确定描述这种情况的最佳方法。在Perl中将位向量转换为二进制文件
本质上,我试图写入需要某个协议的缓冲区。我想要的前两个字节是“10000001”和“11111110”(逐位)。我如何将这两个字节写入Perl中的文件句柄?
我不确定描述这种情况的最佳方法。在Perl中将位向量转换为二进制文件
本质上,我试图写入需要某个协议的缓冲区。我想要的前两个字节是“10000001”和“11111110”(逐位)。我如何将这两个字节写入Perl中的文件句柄?
要拼写出二进制转换成实际的字节,你想要的pack函数或者B
或b
(根据订单你在位):
print FILE pack('B*', '1000000111111110');
但是,如果字节是恒定的,则最好将它们转换为十六进制值并使用\x
以字符串文字转义:
print FILE "\x81\xFE";
如何
# open my $fh, ...
print $fh "\x81\xFE"; # 10000001 and 11111110
由于版本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。左列中的数字是偏移量:特殊标记字节从偏移量零开始(即,立即),并且恰好有两个。