如何在python中创建字节列表?

Posted

技术标签:

【中文标题】如何在python中创建字节列表?【英文标题】:How to create bytes list in python? 【发布时间】:2022-01-22 15:40:52 【问题描述】:

我面临在 python 中创建字节列表的挑战。我只想将 int 列表转换为预期结果中提到的字节列表。问题陈述是我想将预期的输出发送到连接到 com 端口的串行设备,并且在当前输出的情况下,串行设备不鼓励使用 '\\' 作为分隔符。请建议我处理字节列表中的“\”的正确方法。

cmdlist = [2, 12, 1, 1, 1, 0, 0, 1, 3, 7, 42, 101, 85, 18]
    
#Convert CMD list to Hex List
for i in range(len(cmdlist)):
    cmdlist[i] = hex(cmdlist[i])

f_cmdList = ''
#Convert hex CMD list to string List
for i in range(len(cmdlist)):
    f_cmdList += '\\' + (cmdlist[i])

Final_cmdlist = (bytes(f_cmdList,'utf-8'))
print(Final_cmdlist)

电流输出:b'\\0x2\\0xc\\0x1\\0x1\\0x1\\0x0\\0x0\\0x1\\0x3\\0x7\\0x2a\\ 0x65\\0x55\\0x12'

预期输出:b'\0x2\0xc\0x1\0x1\0x1\0x0\0x0\0x1\0x3\0x7\0x2a\0x65\0x55\0x12'

谢谢!

【问题讨论】:

你有大于 127 的值吗?或者你为什么这样做? 是的。取值范围为 0 到 255。 您的意图是使用 UTF-8 进行编码,即将值 128 到 255 编码为每个两个字节? 顺便说一句,我非常怀疑你所说的你所期望的就是你所期望的。一堆用零字节分隔的十六进制字符串?你确定吗? 这就像如果我运行上面的代码,我会得到输出字节 - b'\\0x2\\0xc\\0x1\\0x1\\0x1\\0x0\\0x0\\0x1\\0x3\\0x7\\0x2a\\0x65\\0x55\\0x12' 但我想创建一个字节列表,我只想要一个反斜杠而不是字节帧中每个十六进制数字后的 2输出 - b'\0x2\0xc\0x1\0x1\0x1\0x0\0x0\0x1\0x3\0x7\0x2a\0x65\0x55\0x12' 【参考方案1】:

您可以简单地使用bytes 构造函数将列表转换为bytes。您的方法正在尝试创建一个包含字节数组的字符串表示形式的字符串,该字符串在发送到串行设备时将不起作用:

>>> cmdlist = [2, 12, 1, 1, 1, 0, 0, 1, 3, 7, 42, 101, 85, 18]
>>> bytes(cmdlist)
b'\x02\x0c\x01\x01\x01\x00\x00\x01\x03\x07*eU\x12'

【讨论】:

感谢您的快速回复。如果您比较输出的十六进制值,那么我们可以看到存在垃圾数据,或者我们可以说字节构造函数没有将数据转换为十六进制格式作为我们的预期输出。预期输出:b'\0x2\0xc\0x1\0x1\0x1\0x0\0x0\0x1\0x3\0x7\0x2a\0x65\0x55\0x12' bytes 构造函数将数据转换为十六进制。这只是在控制台上打印数组时的表示。因为0x65 也是ASCII e Python 更喜欢将该字符表示为文本。它不会影响您的串行通信。【参考方案2】:

You get what you say you expect 如果你更换你的

f_cmdList += '\\' + (cmdlist[i])

用这个:

f_cmdList += '\0' + cmdlist[i][1:]

但仍然不相信你真的想要那个。

【讨论】:

比较没问题,但是在 ser.write(Final_cmdlist) 中发送Final_cmdlist 时,它将像b'\x00x2\x00xc\x00x1\x00x1\x00x1\x00x0\x00x0\x00x1\x00x3\x00x7\x00x2a\x00x65\x00x55\x00x12' 一样发送到设备,其中设备不会在每个十六进制的反斜杠后鼓励额外的 x0价值。 @Chetan 这只是我们人类的代表。实际的字符串值是相同的。大概你通过打印得到了那个表示?打印你的期望值,你会发现它看起来完全一样。 我同意你的观点,但如果你可以运行下面的代码并且它打印输出的方式是我想要的。 tio.run/##K6gsycjPM7YoKPr/… 所以12 变成了\x08?如何?我没有看到逻辑。

以上是关于如何在python中创建字节列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中创建列表? [复制]

如何在python中创建二维列表

如何根据 .txt 文件中的关键字在 Python 中创建列表?

如何在 Python 中创建多个 for 循环列表的递归以获得组合? [复制]

在 Torch 中,如何从整数标签列表中创建 1-hot 张量?

如何在python中反转字典并从重复的键值中创建一个列表