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