【问题标题】:Python UUID endiannes confusionPython UUID 字节序混淆
【发布时间】:2018-12-19 04:52:01
【问题描述】:

我在 Python 中使用 uuid 包。 RFC 4122 说“UUID 记录定义仅根据以下字段定义 八位字节的整数。”。

但是,当我使用字节顺序(bytesbytes_le)时,我可以看到并非所有 uuid 字段都被转换:

>>> hx(uuid.UUID("d535fc02-e74f-5015-b8c9-a3b89d760ecd").bytes_le)
b'02fc35d54fe71550>>THIS>>b8c9a3b89d760ecd<<'
>>> hx(uuid.UUID("d535fc02-e74f-5015-b8c9-a3b89d760ecd").bytes)
b'd535fc02e74f5015>>THIS>>b8c9a3b89d760ecd<<'

在上面的输出中可以看出,无论 UUID 表示的字节顺序如何,最后 8 个字节都不会改变。

现在,假设目标机器是 little-endian,我们以 big-endian 字节顺序(根据 RFC)接收 UUID,并且必须将其转换为内部表示,即根据平台将其字段解析为整数表示。

我应该反转哪些字节?我应该只反转 time low、time mid 和 time high 和版本,而时钟序列和节点保持不变?

【问题讨论】:

    标签: python uuid endianness


    【解决方案1】:

    UUID 以大端字节序发送。转换为本地字节序取决于平台,因此您可以使用UUID.fields 元组。前 3 个字段应进行转换,以便您可以将其用作整数。

    UUID 的创建也是如此。您无需指定 fields 元组的字节序,因为平台已经知道。

    最后 8 个字节不会被转换,因为它们不是多字节数。它们是 2 个单字节时钟值和描述节点的 6 字节字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多