2012-05-09 100 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。左列中的數字是偏移量:特殊標記字節從偏移量零開始(即,立即),並且恰好有兩個。

相關問題