2012-02-20 250 views

回答

4

A沒有這顯然不首例匹配A:80/binary大小80個字節。

1> A = <<"hello">>. 
<<"hello">> 
2> B = <<A/binary, 100:8>>. 
<<"hellod">> 
3> Pad = 80 - size(A), C = <<A/binary, 0:Pad/unit:8, 100:8>>. 
<<104,101,108,108,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 
    0,0,0,0,0,0,...>> 

<<"hello">><<$h,$e,$l,$l,$o>>語法糖。位語法表達式默認採用8/integer,unsigned,big,unit:1類型規範。 A不是整數,所以<<A>>在第二種情況下引發badarg異常。

+0

我認爲A/80的意思是80位,而不是80字節,對吧? – why 2012-02-20 13:38:50

+0

A =「你好」。 <>。是好的 – why 2012-02-20 13:40:30

+0

@why:默認情況下請參閱[文檔](http://erlang.org/doc/reference_manual/expressions.html#id77447)。根據文檔,'binary'具有默認值'unit:8'。 – 2012-02-20 21:14:49

0

值< <「你好」>>的作品,但只是因爲「你好」是一個字符串文字。當你寫,

A = "Hello", 

你正在創建一個字符串對象,這是一個真正的unicode codepoints的列表。現在,當你聲明時,

<<A>> 

然後A被認爲是一個整數,因爲這是默認值。當你嘗試爲一個整數注入一個列表/字符串時,很自然會出現問題,這是badarg的原因。

的解決方案是雙重的:

list_to_binary(A) 

將列表轉換爲二進制。現在你有<<A/binary>>相媲美,並可以對其進行操作:

L = byte_size(A), 
    <<L:32/integer, A/binary>>