将包含字节数组的字符串转换为uint16

时间:2019-02-11 12:45:16

标签: python arrays data-conversion

我有一个大的字节数组,我将其存储到文件中以进行后处理。对于此示例,我们假设数据是一个从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),{ {1}}等。

是否有方便的函数或Python方式从字符串ord(1)中提取并将其转换为b'\x00\x00\x01\x00\x02\x00\x03\x00'的数组?

2 个答案:

答案 0 :(得分:1)

您需要使用shortunsigned short:)

>>> 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)

答案 1 :(得分:0)

如果获得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))