如何在另一个二进制中定义二进制?

时间:2012-02-20 08:52:27

标签: erlang

A = <<"hello">>.
B = <<A:80/binary, 100:8>>.

它给了我:

  

**异常错误:错误的参数

<<"hello">>.有效,但是:

A = "hello".
<<A>>.

无法正常工作。

2 个答案:

答案 0 :(得分:4)

A没有80字节的大小,在第一种情况下显然与A:80/binary不匹配。

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异常。

答案 1 :(得分:0)

值&lt;&lt;“Hello”&gt;&gt;但只是因为“Hello”是一个字符串文字。当你写作时,

  A = "Hello",

您正在创建一个String对象,它实际上是一个unicode代码点列表。现在,当你宣布时,

  <<A>>

然后A被假定为整数,因为它是默认值。当你尝试为整数注入一个列表/字符串时,自然会出现问题,这就是badarg的原因。

解决方案有两个方面:

  list_to_binary(A)

会将列表转换为二进制文件。现在你有<<A/binary>>的等价物,你可以操纵它:

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