我不確定描述這種情況的最佳方法。在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。左列中的數字是偏移量:特殊標記字節從偏移量零開始(即,立即),並且恰好有兩個。