【问题标题】:Converting string which contains bytearray to uint16将包含字节数组的字符串转换为 uint16
【发布时间】:2019-02-11 12:45:15
【问题描述】:

我有一个大字节数组,我将其存储到一个文件中,用于后处理。对于这个例子,假设数据是一个从 0 到 3 以 10 为底的计数器。

我从某种方法中检索数据的格式是字节数组,我需要有效地存储它,因为模拟需要大量数据集。因此我将其存储为

f=open('data_0.txt','w')
f.write(str(b_a))
f.close()

当我阅读它时,我得到一串数据:data_read = b'\x00\x00\x01\x00\x02\x00\x03\x00'

f=open('data_0.txt')
data_read = f.read()
f.close()

我希望一个函数接受字符串:b'\x00\x00\x01\x00\x02\x00\x03\x00' 并将其转换为 [0, 1, 2, 3] 的数组。

当我使用struct.unpack("BBBBBBBB" , data_read) 时,我希望0,0,1,0,2,0,3,0,而不是只显示 b、'、\、x 等的 ascii,ord(0)ord(1) 等也是一样的。

是否有任何方便的函数或 Pythonic 方式从字符串:b'\x00\x00\x01\x00\x02\x00\x03\x00' 并将其转换为 [0, 1, 2, 3] 的数组?

【问题讨论】:

标签: python arrays data-conversion


【解决方案1】:

您需要使用shorts 或unsigned shorts:)

>>> import struct
>>> data_read
b'\x00\x00\x01\x00\x02\x00\x03\x00'
>>> struct.unpack("hhhh" , data_read)
(0, 1, 2, 3)
>>> struct.unpack("HHHH" , data_read)
(0, 1, 2, 3)

【讨论】:

  • 你好,我还不熟悉struct,你使用四个H是因为你期望一个四值数组吗?
  • data_read 的长度为 8 个bytes。由于您期望 4 个值,我使用了 unisgned shorts
【解决方案2】:

如果你得到 b,',\,x 等的 ascii 显示,这意味着文件实际上包含它。实际上是str(b_a)调用引起的。

演示:

>>> b_a = b'\x00\x00\x01\x00\x02\x00\x03\x00'
>>> s_a = str(b_a)
>>> print(s_a)
b'\x00\x00\x01\x00\x02\x00\x03\x00'
>>> [hex(ord(x)) for x in s_a]
['0x62', '0x27', '0x5c', '0x78', '0x30', '0x30', '0x5c', '0x78', '0x30', '0x30', '0x5c', '0x78', '0x30', '0x31', '0x5c', '0x78', '0x30', '0x30', '0x5c', '0x78', '0x30', '0x32', '0x5c', '0x78', '0x30', '0x30', '0x5c', '0x78', '0x30', '0x33', '0x5c', '0x78', '0x30', '0x30', '0x27']

这是b、'、\、x、0等的显示

ast.literal_eval 可用于将其转换回字节字符串。演示:

>>> b2 = ast.literal_eval(s_a)
>>> b2 == b_a
True
>>> struct.unpack('HHHH', b2)
(0, 1, 2, 3)

所以如果你想在写的时候保持str调用,你必须这样读:

with open('data_0.txt') as f:
    data_read = f.read()
data = struct.unpack('HHHH', ast.literal_eval(data_read))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 2017-02-14
    相关资源
    最近更新 更多