1

我一直在阅读有关 Erlang 的书,以评估它是否适合我的项目,并且对Learn You Some Erlang for Great Book的位语法部分感到困惑。

简单来说,代码如下:

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

令我困惑的是:Color变量是 24 位的,但是 Erlang 怎么知道它必须将变量(在第 2 行)分成三段?规则是怎么读的?

我试图阅读本章的其余部分,但它让我越来越困惑,因为我不明白它是如何划分数字的。你能解释一下位语法是如何工作的吗?它怎么知道它是 3 段,<<154, 41>>当我这样做时它怎么会变成:

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

之前谢谢。

4

3 回答 3

7

Color = 16#F09A29 是一个整数,可以写成十进制表示的 15768105,以及

00000000111100001001101000101001

以二进制表示。

当您定义二进制像素 = << Color:24 >>。它只是意味着您说“将 24 个不太重要的颜色位与二进制像素匹配”。所以 Pixel 有界

111100001001101000101001,

没有任何分裂! 当 shell 将其打印出来时,它会以十进制表示形式逐字节执行,即:

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个较低的有效位),当shell打印它们时,它像往常一样开始,将二进制文件分成字节,所以

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 回答