2012-09-22 22 views
1

我一直在閱讀有關Erlang的書籍,以評估它是否適合我的項目,並且可以在Learn You Some Erlang for Great Book的位語法部分實現。Erlang位語法:它如何知道它是3個組件?

簡單地說,這裏是代碼:

1> Color = 16#F09A29. 
15768105 
2> Pixel = <<Color:24>>. 
<<240,154,41>> 

什麼困惑我是這樣的:Color變量是24位,但怎麼可能二郎知道它的變量(第2行)分爲三段?規則是如何讀取的?

我試過閱讀本章的其餘部分,但它越來越讓我困惑,因爲我不明白它是如何分割數字的。你能解釋一下位語法是如何工作的嗎?它怎麼能知道它的3段,以及它如何成爲<<154, 41>>當我這樣做:

1> Color = 16#F09A29. 
15768105 
2> Pixel = <<Color:16>>. 
<<154,41>> 

由於之前。

回答

7

顏色= 16#F09A29是可以在十進制表示被寫爲15768105的整數,以及

在二進制表示。

當你定義一個二進制像素= < <顏色:24 >>。它只是意味着你說「匹配顏色的二十四個較低有效位與二進制像素」。所以像素爲界,

111100001001101000101001,

沒有任何分裂!殼打印出來時,它確實它每字節字節在十進制表示是:

11110000 = 15 * 16 = 240,10011010 = 9 * 16 + 10 = 154,00101001 = 2 * 16 + 9 = 41 => < < 240,154,41 >>

以相同的方式

,在定義像素= < <顏色:16 >>,只需要16點以下顯著位,並將其分配到二進制=

1001101000101001,

其上打印10011010 =

9 * 16 + 10 = 154,00101001 = 2 * 16 + 9 = 41 => < < 154,41 >>。

在<的情況下>二進制現在等於

(21少顯著位)和當所述殼打印他們,它開始像往常一樣,分割二進制字節如此

10000100 = 8 * 16 + 4 = 132,11010001 = 13 * 16 +1 = 209,因爲它只保留5位01001,最後一個數據塊被打印5:9到t ELL我們的最後一個值的大小不是8位= 1個字節如常,但只有5位=>

< < 132,209,5:9 >>。

二進制文件的好處在於,您可以使用大小規範對其進行「解碼」(可能對示例波紋管更清晰)。

([email protected])43> Co=16#F09A29. 
15768105 
([email protected])44> Pi = <<Co:24>>. 
<<240,154,41>> 
([email protected])45> <<R:8,V:8,B:8>> = Pi. 
<<240,154,41>> 
([email protected])46> R. 
240 
+0

非常感謝。我已經將你的帖子標記爲答案,因爲它顯然更好。 – bertzzie

1

Erlang並沒有真正「分」任何東西。二進制文件只是連續的數據塊。這是由REPL打印的默認人類可讀表示,是一個逗號分隔的字節值列表。

+0

因此,它需要24位('F09A29')並將其切成3 8位段?我對嗎? – bertzzie

+0

對不起,我已經搞亂了以前的評論。當Erlang打印二進制文件時,它從最高有效字節開始,可能注意到最後一個元素少於8位: '<>' '<<132,209,9:5>>' – rkhayrov

0

它只是顯示組成二進制文件的8位字節。你告訴它得到24位,並且它以每個單獨字節的數字表示(0-255)來表示它們。

相關問題