如何在另一个二进制文件中定义二进制文件?
问题描述:
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