【问题标题】:Endianess - hex to dec little endian. uncorrect data typesEndianness - 十六进制到十进制小端。不正确的数据类型
【发布时间】:2021-11-28 05:47:48
【问题描述】:

我将十六进制转换为十进制,但结果是大端,我需要小端(例如 1500 = 21,而不是我得到的 5376)。我尝试使用 struct 函数,但遇到了一些问题:

u16ModuleID_hex = str(f3.read(4))
ba = bytearray.fromhex(u16ModuleID_hex)
ba.reverse()
u16ModuleID_dec = struct.unpack("<h", ba)

错误:在位置 1 的 fromhex() arg 中找到非十六进制数 所以,我补充说:ba = bytearray.fromhex(u16ModuleID_hex[0][2:]) 错误:struct.error: unpack 需要 2 个字节的缓冲区

u16ModuleID_hex 是例如 b'10b5'。我假设它的前面有 b' 和数据类型。

【问题讨论】:

标签: python endianness


【解决方案1】:

只需 .pack().unpack() 您的数据即可翻转字节序:

import struct

a = 0x1500

print(a)
# --> 5376

b, = struct.unpack("<h", struct.pack(">h", a))
print(b)
# --> 21

【讨论】:

  • 我的 a 等于 1500 而不是 0x1500
  • struct.error: 'h' 格式需要 -32768
  • 0x 是在变量定义/声明时确保整数的十六进制表示法。
  • 我知道,但是那怎么添加呢?
  • 请详细说明您问题中的确切数据类型,以便进一步调试。您的原始代码中的某些数据转换可能不正确。
【解决方案2】:

需要小端序(例如,我得到的 1500 = 21 而不是 5376)

查看int.frombytes(需要python3.2 或更新版本)

data = b'\x15\x00'
print(int.from_bytes(data, "big"))
print(int.from_bytes(data, "little"))

输出

5376
21

【讨论】:

  • 如何获取该格式的数据?我的数据只有 1500 个
  • @immonual:由于您的数据似乎是bytes 类型,您应该能够应用这种方法。这里定义data的方式是为了保证一个bytes变量。
  • @immonual 假设 f3 是以读取二进制 ("rb") 模式打开的文件句柄或在 .read 时发出字节的任何其他设备然后执行 int.from_bytes(f3.read(4))
  • TypeError: from_bytes() 缺少必需的参数 'byteorder' (pos 2)
  • @immonaul 对,我忘了字节序,所以int.from_bytes(f3.read(4),"little")
猜你喜欢
  • 2020-05-16
  • 1970-01-01
  • 2011-12-09
  • 2018-07-26
  • 2020-02-09
  • 2014-08-24
  • 2016-01-05
  • 2011-06-01
  • 2023-03-14
相关资源
最近更新 更多