2016-03-18 101 views
0

我有下面的語句殼牌代表二進制

iex(5)> a = <<3>> 
<<3>> 
iex(6)> b = <<a::binary>> 
<<3>> 

第一行,我創建了一個二進制值爲3.在第三行我想要那個殼顯示我不00000011 3,我知道這是沒有意義的第一創建一個二進制(1.line)然後再次轉換爲二進制。但我期待殼牌顯示的我,而不是00000011 3.

當二進制浮法像

iex(7)> a = << 5.3 :: float >> 
<<64, 21, 51, 51, 51, 51, 51, 51>> 

我不明白,爲什麼會出現我這個號碼?

+2

「二進制」在這裏並不意味着「顯示爲基2。「二進制顯示以10爲底,每個字節顯示一個數字 – CoderDennis

+2

http://elixir-lang.org/getting-started/binaries-strings-and-char-lists.html#binaries-和 - bitstrings – sobolevn

回答

3

二進制是內存中的一個字節序列。打印的表示符合這個定義。打印輸出中的每個數字都在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 
+0

它是什麼意思不是可打印的字符?當我輸入'iex(9)><<3000>>'我有'<<184>>'爲什麼?那麼,浮動,你已經顯示上面,它包含8字節? –

+0

a)可打印字符是可以打印的所有字符,例如''<<6>>'ascii表中的是確認,它不是可打印字符或'<<0>>是NULL' b)'<<3000>>'是一個字節二進制,但3000顯然不適合0..255的空間,所以Elixir需要3000 mod 256 = 184.同樣的方式'<<2::size(1)>>'實際上是'<<0::size(1)>>'。 c)是的,這個浮點數在編碼後需要8個字節。 – tkowal

+0

非常感謝這麼多人。現在,二進制文件對我來說更加清晰。 –