Преобразование строки, содержащей bytearray, в uint16 - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть большой байтовый массив, который я сохраняю в файл для последующей обработки.Для этого примера давайте предположим, что данные представляют собой счетчик от 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, вместо этого он просто отображает ascii для b, ', \, x и т. Д., То же самое для ord(0), ord(1) и т. Д..

Есть ли какая-нибудь удобная функция или способ Pythonic, чтобы перейти из строки: b'\x00\x00\x01\x00\x02\x00\x03\x00' и преобразовать ее в массив [0, 1, 2, 3]?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Если вы получаете отображение ascii для b, ', \, x и т. Д., Это означает, что файл фактически содержит его.Фактически это вызвано вызовом 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))
0 голосов
/ 11 февраля 2019

Вам нужно использовать short s или unsigned short s:)

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