Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 20, 2012 09:40:07

Squash
Зарегистрирован: 2012-08-14
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Бинарную строку в список интов

Есть строка вида ‘\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) без использования цикла?

Отредактировано Squash (Авг. 20, 2012 09:40:53)

Офлайн

#2 Авг. 20, 2012 10:27:51

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Бинарную строку в список интов

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)



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Авг. 20, 2012 11:21:08

Squash
Зарегистрирован: 2012-08-14
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Бинарную строку в список интов

О, спасибо.

Офлайн

#4 Авг. 20, 2012 14:30:18

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Бинарную строку в список интов

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)

Офлайн

#5 Авг. 21, 2012 06:14:41

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Бинарную строку в список интов

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



Отредактировано py.user.next (Авг. 21, 2012 06:18:58)

Офлайн

#6 Авг. 21, 2012 21:23:03

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Бинарную строку в список интов

py.user.next, как я понял, надо с интами и с правильным порядком байтов.

Офлайн

#7 Авг. 22, 2012 00:58:43

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Бинарную строку в список интов

>>> type(bytearray(b'abc')[0])
<type 'int'>
>>>



Офлайн

#8 Авг. 22, 2012 01:19:58

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Бинарную строку в список интов

Ага, только

>>> 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])
А как порядок байтов переключить? И какой дефолтовый?

Отредактировано odnochlen (Авг. 22, 2012 01:23:34)

Офлайн

#9 Авг. 23, 2012 00:58:27

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Бинарную строку в список интов

а, это меня проглючило

>>> 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-х байтовых чисел)



Отредактировано py.user.next (Авг. 23, 2012 04:27:20)

Офлайн

#10 Авг. 23, 2012 05:29:18

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Бинарную строку в список интов

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 нигде не написано о порядке байтов. Баг документации?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version