Найти - Пользователи
Полная версия: Бинарную строку в список интов
Начало » Python для новичков » Бинарную строку в список интов
1 2 3 4
Squash
Есть строка вида ‘\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00’
Можно ли ее певратить в список вида (1,2,3,4,5,0) без использования цикла?
PooH
s ='\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00'
struct.unpack('i'*(len(s)/4),s)
Squash
О, спасибо.
odnochlen
By default, C types are represented in the machine’s native format and byte order, and properly aligned by skipping pad bytes if necessary (according to the rules used by the C compiler).
Надо вручную указывать порядок байтов.

struct.unpack('<%si' % (len(s)/4),s)
py.user.next
>>> s = '\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00'
>>> s.encode('latin1')
b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00'
>>> s.encode('latin1')[0]
1
>>>

для второго
>>> s = '\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00'
>>> bytearray(s)
bytearray(b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00')
>>> bytearray(s)[0]
1
>>>
odnochlen
py.user.next, как я понял, надо с интами и с правильным порядком байтов.
py.user.next
>>> type(bytearray(b'abc')[0])
<type 'int'>
>>>
odnochlen
Ага, только
>>> s = '\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00'
>>> bytearray(s)
bytearray(b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00')
>>> bytearray(s)[0]
1
>>> bytearray(s)[1]
0
# а должно быть 2

Вот еще.
>>> array('L',s)
array('L', [1L, 2L, 3L, 4L, 5L, 0L])
А как порядок байтов переключить? И какой дефолтовый?
py.user.next
а, это меня проглючило
>>> s = '\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00'
>>> bytearray(s[::4])
bytearray(b'\x01\x02\x03\x04\x05\x00')
>>> bytearray(s[::4])[0]
1
>>> bytearray(s[::4])[1]
2
>>>

вот ещё вариант
>>> s = '\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00'
>>> s.decode('utf-32le')
u'\x01\x02\x03\x04\x05\x00'
>>> map(ord, s.decode('utf-32le'))
[1, 2, 3, 4, 5, 0]
>>>
(если рассматривать это как набор 4-х байтовых чисел)
odnochlen
py.user.next
>>> s = '\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00'
>>> bytearray(s[::4])
bytearray(b'\x01\x02\x03\x04\x05\x00')
>>> bytearray(s[::4])[0]
1
>>> bytearray(s[::4])[1]
2
>>>
Ну это, извини меня, быдлокод нижайшего пошиба.

Варианты с unpack и array самые цивильные, только в array нигде не написано о порядке байтов. Баг документации?

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB