【问题标题】:Python struct.pack little endian = big endianPython struct.pack 小端 = 大端
【发布时间】:2020-07-22 00:37:25
【问题描述】:

我正在努力确保我拥有的一些数据被编码为大端二进制。我正在使用 struct 模块来执行此操作。但是,我将两者转换为大端或小端的结果是相同的。为什么?

import sys
import json
import struct

data = {
    "val1": 20,
    "val2": 24
}

b = json.dumps(data, ensure_ascii=False).encode("utf-8")

little = struct.pack(f"<{len(b)}s", b)
big = struct.pack(f">{len(b)}s", b)

print(f"System byteorder: {sys.byteorder}")
print(f"data:\t{b}")
print(f"little:\t{little}")
print(f"big:\t{big}")
print((big == little) and (little == b))



val = 25
b = bytes([val])

big = struct.pack(">H", val)
little = struct.pack("<H", val)

print()
print()
print(f"data:\t{b}")
print(f"little:\t{little}")
print(f"big:\t{big}")
print((big == little) and (little == b))

给出以下结果

System byteorder: little
data:   b'{"val1": 20, "val2": 24}'
little: b'{"val1": 20, "val2": 24}'
big:    b'{"val1": 20, "val2": 24}'
True


data:   b'\x19'
little: b'\x19\x00'
big:    b'\x00\x19'
False

【问题讨论】:

  • 字节串没有字节序。
  • 字符串(字节)是面向字节的,它们没有字节序。正如您在H 代码中看到的那样,字节序被考虑到单独大于字节的事物。
  • 谢谢ShadowRanger,你解开了我的困惑。我的误解是我不明白字节串的每个元素都是单独考虑的。由于每个字符单独只有一个字节,因此现在不需要定义顺序对我来说很有意义。我之前是把字节串作为一个整体来考虑的。

标签: python struct endianness


【解决方案1】:

您正在为char[] 使用格式说明符“s”,它只是一个八位字节串。一串字符/八位字节没有字节序。当您使用“H”时,unsigned short 您会看到大/小顺序相反。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-30
    • 2016-06-13
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多