二進制是內存中的一個字節序列。打印的表示符合這個定義。打印輸出中的每個數字都在0到255之間(這些數字可以表示所有可能的字節值)。
二進制文件是解析和編碼通過網絡發送到外部系統的協議或其他消息的簡便方法。例如,這段代碼解析ip協議:
<< protocol_version :: size(4),
size_in_words :: size(4),
tos :: size(8),
total_length :: size(16),
identifier :: size(16),
flags :: size(3),
fragment_offs :: size(13),
ttl :: size(8),
protocol :: size(8),
header_checksum :: size(16),
src_ip :: size(32),
dst_ip :: size(32),
options :: size(32),
data :: binary >> = bits
您可以匹配二進制文件的不同部分。 size
以位指定。最後一部分可以沒有大小,但它需要有可以被8整除的大小(它必須是n個全字節)。
較簡單的例子可能是數字128,即二進制10000000。
iex(1)> bin = <<128>>
<<128>>
iex(2)> <<a::size(2), b::size(6)>> = bin
<<128>>
iex(3)> a # a matched bits 10, which is 2
2
iex(4)> b # b matched bits 000000 which is 0
0
相同的語法可用於從零件創建二進制文件。讓重用變量a和b,但把它們放在不同的地方。
iex(5)> anotherbin = <<a::size(5), b::size(3)>>
<<16>>
現在第一部分00010和第二部分是000,這給00010000,這是16的另一件事是,你可以不是像花車整數創建其他事情的二進制文件,所以
iex(6)> a = << 5.3 :: float >>
<<64, 21, 51, 51, 51, 51, 51, 51>>
創建另一個浮點值編碼的二進制文件。您現在可以通過網絡發送它並在另一端對其進行解碼。所以它與你的想法相反。它不是二進制的浮點數,而是浮點二進制。
要真正看到東西的二進制表示嘗試使用來自不同模塊的to_string
方法。他們有可選的參數,這是您想要打印輸出的基礎。
iex(7)> Integer.to_string(128, 2)
"10000000"
還有一個問題。 Elixir中的字符串實際上是二進制文件。 shell檢查是否所有字節都是可打印的字符。如果是,則打印出來作爲一個字符串
iex(20)> <<100>>
"d"
您可以強制IO.inspect
打印二進制文件的字節或字符串列表,如果你想:
iex(29)> IO.inspect <<100>>, [{:binaries, :as_binaries}]
<<100>> #this is what IO.inspect printed
"d" #this is a return value, which is the same, but printed as string
如果強制非打印字符被解釋爲字符串,他們將被轉義:
iex(31)> IO.inspect <<2>>, [{:binaries, :as_strings}]
"\x02" #this is what IO.inspect printed
<<2>> #return value printed by shell
「二進制」在這裏並不意味着「顯示爲基2。「二進制顯示以10爲底,每個字節顯示一個數字 – CoderDennis
http://elixir-lang.org/getting-started/binaries-strings-and-char-lists.html#binaries-和 - bitstrings – sobolevn