9

Erlang シェルでは、次のことができます。

A = 300.
    300
<<A:32>>.
    <<0, 0, 1, 44>>

しかし、次のことを試すと:

B = term_to_binary({300}).
    <<131,104,1,98,0,0,1,44>>
<<B:32>>
    ** exception error: bad argument
<<B:64>>
    ** exception error: bad argument

最初のケースでは、整数を取得し、ビット文字列構文を使用してそれを 32 ビット フィールドに入れています。それは期待どおりに機能します。2 番目のケースでは、term_to_binaryBIF を使用してタプルをバイナリに変換し、そこからビット文字列構文を使用して特定のビットをアンパックしようとしています。最初の例は機能するのに、2 番目の例は失敗するのはなぜですか? 両者は非常に似たようなことをしているようです。

4

2 に答える 2

16

バイナリとビット文字列の違いは、バイナリの長さが 8 で割り切れるということです。つまり、「部分的な」バイトは含まれません。ビット文字列にはそのような制限はありません。

この違いは、ここでは問題ではありません。

あなたが直面している問題は、構文が間違っていることです。バイナリから最初の 32 ビットを抽出する場合は、完全に一致するステートメントを次のように記述する必要があります。

<<B1:32, _/binary>> = B.

/binary長さに関係なく、バイナリの残りの部分と一致するため、 が重要であることに注意してください。省略した場合、一致する長さはデフォルトで 8 (つまり 1 バイト) になります。

バイナリとバイナリの操作については、Erlang リファレンス マニュアルのビット構文に関するセクションを参照してください。

編集

あなたのコメントに<<A:32>>は、整数だけでなく、も含まれます。私が提供したリンクによると、ビット構文を使用すると、バインドされた変数のデータ型を含む、バイナリ マッチングの多くの側面を指定できintegerます。この部分は、一致には 32 ビットが必要であることを示しています。これは、データ型によって意味がある場合とない場合がありますが、整数に対してのみ有効であるという意味ではありません。たとえば、10 ビットのビット文字列を記述すると言うことができます。それが役立つことを願っています!floatbinary:32<<Bits:10/bitstring>>

于 2012-05-30T17:24:10.707 に答える