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>>
は、2番目のケースではbadarg
例外を発生させます。
値< < "Hello" >>が機能しますが、「Hello」は文字列リテラルであるためです。
A = "Hello",
実際にはUnicodeコードポイントのリストであるStringオブジェクトを作成しています。今、宣言するとき、
<<A>>
A
は、デフォルトであるため、整数とみなされます。当然ながら、あなたが整数のリスト/文字列を注入しようとすると何かが間違っています。これがbadargの理由です。
ソリューションは、二つある:
list_to_binary(A)
はバイナリにリストを変換します。今、あなたは<<A/binary>>
と同等のものを持っていて、それを操作することができます
L = byte_size(A),
<<L:32/integer, A/binary>>
私はA/80は80バイトではなく、80バイトを意味すると思いますか? – why
A = "hello"。 <> –
why
@why:デフォルトについては、[documentation](http://erlang.org/doc/reference_manual/expressions.html#id77447)を参照してください。 'バイナリ'はドキュメントによるとデフォルト値 'unit:8'を持っています。 –