2012-02-20 8 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>>は、2番目のケースではbadarg例外を発生させます。

+0

私はA/80は80バイトではなく、80バイトを意味すると思いますか? – why

+0

A = "hello"。 <> – why

+0

@why:デフォルトについては、[documentation](http://erlang.org/doc/reference_manual/expressions.html#id77447)を参照してください。 'バイナリ'はドキュメントによるとデフォルト値 'unit:8'を持っています。 –

0

値< < "Hello" >>が機能しますが、「Hello」は文字列リテラルであるためです。

A = "Hello", 

実際にはUnicodeコードポイントのリストであるStringオブジェクトを作成しています。今、宣言するとき、

<<A>> 

Aは、デフォルトであるため、整数とみなされます。当然ながら、あなたが整数のリスト/文字列を注入しようとすると何かが間違っています。これがbadargの理由です。

ソリューションは、二つある:

list_to_binary(A) 

はバイナリにリストを変換します。今、あなたは<<A/binary>>と同等のものを持っていて、それを操作することができます

L = byte_size(A), 
    <<L:32/integer, A/binary>> 
関連する問題