【问题标题】:Julia bitstring function and byte orderJulia 位串函数和字节顺序
【发布时间】:2019-05-08 11:28:39
【问题描述】:

我在 Windows 8.1 下运行 Julia 1.0.2。

以下内容让我相信 Julia 以“小端”方式对待我的机器:

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.

基于上述,下面的位串示例对我来说很有意义。两者都有最不重要的字节,在左边,正如我对 little-endian 字节顺序所期望的那样:

julia> bitstring(1.0)
"0011111111110000000000000000000000000000000000000000000000000000"

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

但是,下面的例子似乎是大端顺序,最低有效字节在右边:

julia> bitstring(1)
"0000000000000000000000000000000000000000000000000000000000000001"

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

【问题讨论】:

    标签: julia


    【解决方案1】:

    在您的问题中有两个不同的问题。

    Char 表示是 Julia 中的自定义设计决策;方法是一个字符的UTF-8表示在右侧填充0s,得到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 究竟做了什么,因为它是相关的。

    【讨论】:

    • 感谢您指出 hton() 和 htol()。这两个回答很有帮助!
    【解决方案2】:

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

    这是因为位串最常用于使用标志的现实检查代码,而<< 等人在主机字节顺序上操作。

    【讨论】:

    • 不错的答案。 bitstring 所做的另一种说法是,它写出一个二进制表示,就像人类写它一样,例如在一张用0填充数字的纸上。
    • 感谢您的帮助!
    猜你喜欢
    • 2020-01-13
    • 1970-01-01
    • 2013-01-21
    • 2023-04-06
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    相关资源
    最近更新 更多