diff --git a/7-binary/7-note.md b/7-binary/7-note.md index c270603..5b3cfd0 100644 --- a/7-binary/7-note.md +++ b/7-binary/7-note.md @@ -65,15 +65,31 @@ utf16,utf32 无需提供该值 一个片段的总长度是Size × Unit字节。binary类型的片段长度必需是8的整数倍 + + 字节序: + 大端字节序:高位字节在前,低位字节在后,人类读写数值的方法。 + 小端字节序:地位字节在前,高位字节在后。电路先处理低位字节。除了计算机内部处理,其他场合几乎都是大端字节序,比如文件传输和文件存储。 + 读取的时候要考虑字节序,其他情况都不用考虑。 + + 举个例子:处理器读到一个16为的整数,如果是大端字节,就按下面的方式转换. + x = buf[offset] * 256 + buf[offset+1]; + buf是整个数据块在内存中的起始地址,offset是当前正在读取的位置。第一个字节乘以256,再加上第二个字节,就是大端字节序的值。等效于下面的式子 + x = buf[offset] << 8 | buf[offset+1]; + 如果是小端字节序: + x = buf[offset+1] << 8 | buf[offset]; + %% 32位大端字节序 + x = (buf[offset+3]) | (buf[offset+2] << 8) | (buf[offset+1] << 16) | (buf[offset] << 24) + %% 32位小端字节序 + x = (buf[offset]) | (buf[offset+1] << 8) | (buf[offset+2] << 16) | (buf[offset+3] << 24) 1><<16#12345678:32/big-signed>>. <<18,52,86,120>> 2><<16#12345678:32/little-signed>>. <<120,86,52,18>> - 3><<12345678:32/little-signed>>. %% 地位先发送 + 3><<12345678:32/little-signed>>. %% 低位在前 <<78,97,188,0>> 4><<12345678:32/big>>. - <<0,188,97,78>> %% 高位的数据先发送 + <<0,188,97,78>> %% 高位的数据在前,符合人类的阅读习惯 5>integer_to_list(12345678,2). "101111000110000101001110" "10111100 01100001 01001110"