Уведомления

Группа в Telegram: @pythonsu

#1 Март 31, 2014 21:25:41

vic_gor
Зарегистрирован: 2014-03-31
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Получить массив байт

Для просто списка делаю вот так a = array= bytearray(a)
Как получить массив байт со списка вот такого типа [0x0A, 0x0B, 0x0C, , “string”] ?



Офлайн

#2 Апрель 1, 2014 05:42:50

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

Получить массив байт

>>> lst = [0x0A, 0x0B, 0x0C, 'string']
>>> 
>>> bt = bytearray()
>>> for i in lst:
...     if type(i) is int:
...         bt.append(i)
...     else:
...         bt.extend(i.encode('latin1'))
... 
>>> bt
bytearray(b'\n\x0b\x0cstring')
>>>



Офлайн

#3 Апрель 1, 2014 08:46:46

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Получить массив байт

py.user.next
C целыми скорее так:

# python 2.x
for i in lst:
    if isinstance(i, (int, long)):
        bt.append(chr(i))
...
# python 3.x
for i in lst:
    if isinstance(i, int):
        bt.append(i.to_bytes(1, byteorder='big'))
...



Офлайн

#4 Апрель 1, 2014 10:04:35

vic_gor
Зарегистрирован: 2014-03-31
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Получить массив байт

Большое спасибо. Думал есть какое то универсальное решение.

До этого писал на СИ на ARM, AVR. так там все просто есть структура данных привожу к указателю и делаю инкремент …

А если например такого типа, lst = [0x31, 0x32, 0x33, [0x34, 0x35, ]] или я вообще не знаю сколько вложенных типов, есть строки или нет …
?

Офлайн

#5 Апрель 1, 2014 21:26:14

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Получить массив байт

vic_gor
До этого писал на СИ на ARM, AVR
Не очень понятно что вы имеете ввиду.
Посмотрите например:
https://docs.python.org/2/extending/
https://docs.python.org/2/extending/embedding.html#pure-embedding
Каждая вошка в списке это достаточно сложный объект раскиданный в памяти. Список это грубо говоря PyObject в котором хранятся указатели на другие PyObject там есть информация о типе и т.п. Ничего хорошего из приведения типа указателей не получится.



Офлайн

#6 Апрель 1, 2014 23:06:20

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

Получить массив байт

pyuser
C целыми скорее так:
bt.append(i.to_bytes(1, byteorder='big'))

>>> (256).to_bytes(1, 'big')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: int too big to convert
>>>

>>> (256).to_bytes(4, 'big')
b'\x00\x00\x01\x00'
>>>
не думаю, что ему нужны нули слева

да и при .extend()'е в чём будут отличия между 256 и ‘\x01\x00’ ?
>>> (256).to_bytes(2, 'big')
b'\x01\x00'
>>> '\x01\x00'.encode('latin1')
b'\x01\x00'
>>>

при любом значении length найдётся такое число, которое не будет в него помещаться (OverflowError)

вообще, усложнять цикл не стоит, лучше выполнить декомпозицию (обработать список до цикла)



Отредактировано py.user.next (Апрель 1, 2014 23:08:35)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version