2012-02-20 105 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>>