【问题标题】:Python3: Converting or 'Casting' byte array string from string to bytes arrayPython3:将字节数组字符串从字符串转换或“转换”为字节数组
【发布时间】:2014-03-18 12:12:03
【问题描述】:

这个 python 东西的新手。 不久前,我保存了连接到串行端口的外部设备的输出,因为我无法保留该设备。我将串行端口的数据作为字节读取,目的是为该设备创建一个模拟器。 数据每行保存一个“字节”到文件中,如下面的示例提取。

b'\x9a'
b'X'
b'}'
b'}'
b'x'
b'\x8c'

我想从数据捕获中读取每一行,并将本来是原始字节的内容附加到字节数组中。 我在字节数组上尝试了各种 append() 和连接操作 (+=),但上面的行是 python 字符串对象,这些操作失败了。

有没有简单的方法(内置方法?)将这些行的每个原始字节值添加到字节数组中?

谢谢。

M

更新 我遇到了 .encode() 字符串方法,并创建了一个粗略的函数来满足我的需求。

def string2byte(str):
    # the 'byte' string will consist of 5, 6 or 8 characters including the newline
    # as in b',' or b'\r' or b'\x0A'
    if len(str) == 5:
        return str[2].encode('Latin-1')
    elif len(str) == 6:
        return str[3].encode('Latin-1')
    else:
        return str[4:6].encode('Latin-1')

...嗯,它很实用。

如果有人知道更优雅的解决方案,也许你会很乐意发布这个。

【问题讨论】:

  • 您的代码似乎不正确,例如,对于 "b'\\r'\n",您的代码生成 b'r' 而不是 b'\r'
  • 谢谢你,JF。错过了。

标签: python-3.x casting bytearray


【解决方案1】:

b'\x9a' 是 Python 源代码中字节 0x9a 的文字表示。如果您的文件实际上包含这七个字符b'\x9a',那么它很糟糕,因为您可以只使用一个字节来保存它。您可以使用ast.literal_eval() 将其转换为字节:

import ast

with open('input') as file:
    a = b"".join(map(ast.literal_eval, file)) # assume 1 byte literal per line

【讨论】:

  • @J.F.我通过将端口上的所有字节读入字节数组来创建文件。在这个阶段我做了一些测试/检查来发现和/或确认数据的性质。然后我将字节数组中的数据一次一个字节地写入文件(我现在正在尝试处理)。您提供的代码似乎工作得很好,JF。谢谢你。我想我现在有很多阅读工作要做。
  • @eryksun J.F. 的代码似乎在 python3 中运行良好,正如您所建议的那样。也谢谢你。照顾好一切。
  • @eryksun:确实,ast.literal_eval("b'\\x9a'\n") 适用于 Python 3。我删除了不正确的注释。
猜你喜欢
  • 2020-11-04
  • 1970-01-01
  • 2021-11-11
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多