Julia的位串功能和字节顺序

时间:2018-12-06 17:41:53

标签: julia

我正在Windows 8.1下运行Julia 1.0.2。

以下内容使我相信Julia会以“ little-endian”方式对待我的机器:

julia> VERSION
v"1.0.2"

julia> ENDIAN_BOM
0x04030201

help?> ENDIAN_BOM
search: ENDIAN_BOM

  ENDIAN_BOM

  The 32-bit byte-order-mark indicates the native byte order of the host machine. Little-endian
  machines will contain the value 0x04030201. Big-endian machines will contain the value
  0x01020304.

基于上面,下面的位串示例对我来说很有意义。就像我期望的小尾数字节顺序一样,它们的左边都具有最低有效字节。

julia> bitstring(1.0)
"0011111111110000000000000000000000000000000000000000000000000000"

julia> bitstring(Char(1))
"00000001000000000000000000000000"

但是,以下示例似乎是大端顺序,最低有效字节在右侧:

julia> bitstring(1)
"0000000000000000000000000000000000000000000000000000000000000001"

我感到困惑吗?有什么建议或解释吗?

2 个答案:

答案 0 :(得分:3)

bitstring关心主机字节顺序。换一种说法, julia> bitstring(1) "0000000000000000000000000000000000000000000000000000000000000001" 与机器无关,但是 julia> bitstring(hton(1)) "0000000100000000000000000000000000000000000000000000000000000000" 反映你的拱门。如果您解析数据包,请插入htonntoh

这是因为位串最常用于使用标志的真实性检查代码,<<等人按主机字节顺序进行操作。

答案 1 :(得分:2)

您的问题中有两个独立的问题。

Char表示形式是Julia的自定义设计决策;该方法是在字符的UTF-8表示形式的右侧用0填充以获得4个字节(UInt32);您可以查看会议如何进行,例如在Char(u::UInt32)方法定义中。

对于1.01,您可以使用htolhton函数查看它们的大尾数表示法,您将得到:

julia> bitstring(htol(1))
"0000000000000000000000000000000000000000000000000000000000000001"

julia> bitstring(hton(1))
"0000000100000000000000000000000000000000000000000000000000000000"

julia> bitstring(htol(1.0))
"0011111111110000000000000000000000000000000000000000000000000000"

julia> bitstring(hton(1.0))
"0000000000000000000000000000000000000000000000001111000000111111"

而且一切都是一致的。

编辑:请参阅其他答案中的说明bitstring的确切含义。