A = <<"hello">>.
B = <<A:80/binary, 100:8>>.
** exception error: bad argument
和<<"hello">>.
作品,但:
A = "hello".
<<A>>.
不能工作。
A = <<"hello">>.
B = <<A:80/binary, 100:8>>.
** exception error: bad argument
和<<"hello">>.
作品,但:
A = "hello".
<<A>>.
不能工作。
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
異常。
值< <「你好」>>的作品,但只是因爲「你好」是一個字符串文字。當你寫,
A = "Hello",
你正在創建一個字符串對象,這是一個真正的unicode codepoints的列表。現在,當你聲明時,
<<A>>
然後A
被認爲是一個整數,因爲這是默認值。當你嘗試爲一個整數注入一個列表/字符串時,很自然會出現問題,這是badarg的原因。
的解決方案是雙重的:
list_to_binary(A)
將列表轉換爲二進制。現在你有<<A/binary>>
相媲美,並可以對其進行操作:
L = byte_size(A),
<<L:32/integer, A/binary>>
我認爲A/80的意思是80位,而不是80字節,對吧? – why 2012-02-20 13:38:50
A =「你好」。 <>。是好的 –
why
2012-02-20 13:40:30
@why:默認情況下請參閱[文檔](http://erlang.org/doc/reference_manual/expressions.html#id77447)。根據文檔,'binary'具有默認值'unit:8'。 – 2012-02-20 21:14:49