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



py.user.next
>>> 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')
>>>
pyuser
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'))
...
vic_gor
Большое спасибо. Думал есть какое то универсальное решение.

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

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

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

вообще, усложнять цикл не стоит, лучше выполнить декомпозицию (обработать список до цикла)
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