Форум сайта python.su
0
Есть строка вида ‘\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)
Офлайн
72
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)
Офлайн
0
О, спасибо.
Офлайн
14
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)
Офлайн
857
>>> 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)
Офлайн
14
py.user.next, как я понял, надо с интами и с правильным порядком байтов.
Офлайн
857
>>> type(bytearray(b'abc')[0]) <type 'int'> >>>
Офлайн
14
Ага, только
>>> 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)
Офлайн
857
а, это меня проглючило
>>> 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] >>>
Отредактировано py.user.next (Авг. 23, 2012 04:27:20)
Офлайн
14
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 >>>
Офлайн