【问题标题】:convert hex string (python 2) to byte with hex numbers in Python 3在 Python 3 中将十六进制字符串(python 2)转换为带有十六进制数字的字节
【发布时间】:2018-08-09 13:46:21
【问题描述】:

我正在转换我的代码,使其适用于 Python 3。剩下的主要问题是成功使用 serial.write 命令。在我之前的代码中,我创建了一个这样的字符串: 读取帧='\xAA\x00\x01\x00\x00\x00\x65\x00\x00\x00\x0A\x00\x6F\x71'。然后使用 serial.write(read_frame) 发送这个字符串。

然而,在 Python 3 中,我必须将其转换为“字节”才能使用 serial.write(read_frame)。如果它是一个静态框架,将其声明为: read_frame_byte=b'\xAA\x00\x01\x00\x00\x00\x65\x00\x00\x00\x0A\x00\x6F\x71'

然而,问题是我动态创建了这个十六进制字符串,所以最后我必须将字符串转换为字节。如果我使用命令 read_frame.encode('utf-8'),则转换会产生不同的十六进制数(例如,x65 变为 xe,因为这是相应的 ASCII 值)。这在技术上是正确的,但我只想将字符串转换为字节而不更改任何值。进行此转换的任何建议/解决方法?

【问题讨论】:

  • 您好,欢迎来到堆栈溢出。对于其他人来说,查看您的非工作代码的更完整示例以提供更好的上下文会很有用

标签: python-3.x encoding type-conversion hex byte


【解决方案1】:

我猜你正在创建一个"AA0001000000650000000A006F71" 形式的十六进制字符串,并且你想从每对十六进制数字中创建一个字节。我不应该猜测......

获取您的数据:

>>> digits = "AA0001000000650000000A006F71"

把它分成两个字符的块:

>>> [digits[i:i+2] for i in range(0, len(digits), 2)]
['AA', '00', '01', '00', '00', '00', '65', '00', '00', '00', '0A', '00', '6F', '71']

添加到整数的转换,告诉内置的int使用base 16:

>>> [int(digits[i:i+2], 16) for i in range(0, len(digits), 2)]
[170, 0, 1, 0, 0, 0, 101, 0, 0, 0, 10, 0, 111, 113]

最后,将整数列表转换为bytes 对象:

>>> bytes([int(digits[i:i+2], 16) for i in range(0, len(digits), 2)])
b'\xaa\x00\x01\x00\x00\x00e\x00\x00\x00\n\x00oq'

【讨论】:

  • 谢谢,这是正确的。如果我的问题不够清楚,我深表歉意。然而,现在的问题是得到的字节 b'\xaa\x00\x01\x00\x00\x00e\x00\x00\x00\n\x00oq' 不等于我想要的结果,即:b' \xAA\x00\x01\x00\x00\x00\x65\x00\x00\x00\x0A\x00\x6F\x71'。有没有办法用你的方法检索那个确切的结果?
  • 我想你会发现如果你检查“o”的十六进制代码是 6F。 Python 不使用转义码来表示可打印的 ASCII 字符!
  • 谢谢,现在终于可以使用了。问题是我之前的转换方法,即:bytes(read_frame.encode()),得到的字节以一个额外的字符'xc2'开头:b'\xc2\xaa\x00\x01\x00\x00\x00e\ x00\x00\x00\n\x00oq'。因此,我认为整个框架的格式不正确。显然,这个额外的字节是通信不起作用的原因。感谢您的帮助!
  • 别担心,也别担心不明显的问题:我的精神力量显然仍然有效!下一次,问问自己,如果你是其他人,是否会理解这个问题;-)
猜你喜欢
  • 2012-08-15
  • 2012-06-05
  • 2017-08-23
  • 2019-07-27
  • 2015-01-06
  • 1970-01-01
  • 2020-06-20
  • 2013-09-12
  • 2021-08-29
相关资源
最近更新 更多