1

私はErlangについての本を読んで、それが私のプロジェクトに適しているかどうかを評価し、 Learn You Some Erlang forGreatBookのビット構文の部分を調べてきました。

簡単に言えば、コードは次のとおりです。

1> Color = 16#F09A29.
15768105
2> Pixel = <<Color:24>>.
<<240,154,41>>

私を混乱させているのはこれです:Color変数は24ビットですが、Erlangは変数(2行目)を3つのセグメントに分割する必要があることをどうやって知ることができますか?ルールはどのように読み取られますか?

この章の残りの部分を読み込もうとしましたが、数字がどのように分割されるかがわからないため、ますます混乱しています。ビット構文がどのように機能するか説明していただけますか?それが3つのセグメントであることをどのように知ることができますか、そして<<154, 41>>私がこれを行うとどうなることができますか?

1> Color = 16#F09A29.
15768105
2> Pixel = <<Color:16>>.
<<154,41>>

前に感謝します。

4

3 に答える 3

7

Color = 16#F09A29は、10進表現で15768105と記述できる整数であり、

00000000111100001001101000101001

バイナリ表現で。

バイナリピクセルを定義する場合=<<Color:24>>。これは、「重要度の低い24ビットの色をバイナリピクセルと一致させる」という意味です。したがって、Pixelは

111100001001101000101001、

分割せずに! シェルがそれを出力するとき、それは10進表現でバイトごとにそれを行います:

11110000 = 15 * 16 = 240、10011010 = 9 * 16 + 10 = 154、00101001 = 2 * 16 + 9 = 41 => << 240,154,41 >>

同様に、Pixel = << Color:16 >>を定義すると、重要度の低い16ビットのみが取得され、バイナリ=に割り当てられます。

1001101000101001、

印刷される10011010=

9 * 16 + 10 = 154、00101001 = 2 * 16 + 9 = 41 => <<154,41>>。

<>の場合、バイナリは今

100001001101000101001

(21の重要度の低いビット)そしてシェルがそれらを出力すると、通常どおりに開始し、バイナリをバイトに分割します。

10000100 = 8 * 16 + 4 = 132、11010001 = 13 * 16 +1 = 209、残りは5ビット01001であるため、データの最後のチャンクが5:9に出力され、最後の値のサイズが8ビット=通常どおり1バイトですが、5ビットのみ=>

<< 132,209,5:9>>。

バイナリの良いところは、サイズ指定を使用してそれらを「デコード」できることです(おそらく、以下の例でより明確になります)。

(exec@WXFRB1824L)43> Co=16#F09A29.
15768105
(exec@WXFRB1824L)44> Pi = <<Co:24>>.
<<240,154,41>>
(exec@WXFRB1824L)45> <<R:8,V:8,B:8>> = Pi.
<<240,154,41>>
(exec@WXFRB1824L)46> R.
240
于 2012-09-22T11:05:40.887 に答える
1

Erlangは実際には何も「分割」しません。バイナリは、データの単なる連続ブロックです。これは、REPLによって出力されるデフォルトの人間が読める表現であり、バイト値のコンマ区切りのリストです。

于 2012-09-22T05:35:56.513 に答える
0

バイナリを構成する8ビットバイトを示しているだけです。24ビットを取得するように指示し、個々のバイトの数値表現(0〜255)でレンダリングします。

于 2012-09-22T05:40:28.763 に答える