【问题标题】:Convert hex to uint16 little-endian将十六进制转换为 uint16 little-endian
【发布时间】:2020-06-22 19:31:14
【问题描述】:

我正在尝试将十六进制字符串列表转换为 little-endian 格式。

代码:

hex = ['1A05','1A05','1A05'] 
endian = int(str(hex),16)
print(endian)

但是,它不起作用并抛出错误:

ValueError: int() 基数为 16 的无效文字:

我期待:

[1306, 1306, 1306]

如果我写的话很有趣:

endian = int('1A05',16)

我没有收到错误并返回

6661

但这是将'1A05' 解释为大端的结果。我期待得到 1306 (0x051A) 结果。

【问题讨论】:

  • 您得到第一个错误,因为您正在尝试将列表的字符串表示形式转换为整数。
  • @mkrieger1 我认为他的意思是将十六进制字节视为大端的结果,他希望将1A05 解析为051A
  • @Barmar 是的,我现在知道了。我确定以前有人问过这个问题,但我还没有找到好的副本。
  • 正确的方法包括两个步骤:(1)将十六进制字符串解析为bytesduplicate #1); (2) 将bytes 转换为整数,指定小端字节序(duplicate #2)。
  • 正如@mkrieger1 指出的那样,您有两个问题。使用他提供的链接解决这两个问题。

标签: python hex endianness


【解决方案1】:

您需要单独处理列表的每个元素,而不是一次处理整个列表。您可以通过列表推导来做到这一点。

如果你想要little-endian,你必须在将它解析为整数之前交换字符串的一半:

hex = ['1A05','1A05','1A05'] 
endian = [int(h[2:4] + h[0:2], 16) for h in hex]

但是,只有在十六进制字符串始终为 4 个字符时才有效。你也可以在解析后使用位操作交换整数的字节:

for h in hex:
    i = int(h, 16)
    i = i & 0xff << 16 | i & 0xff00 >> 16
    endian.append(i)

【讨论】:

    猜你喜欢
    • 2013-09-01
    • 2020-06-05
    • 1970-01-01
    • 2023-03-20
    • 2022-06-10
    • 2017-12-01
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多