Байтовий масив у Python


80

Як я можу представляти байтовий масив (як у Java з байтом []) у Python? Мені потрібно буде надіслати його по дроту з gevent.

byte key[] = {0x13, 0x00, 0x00, 0x00, 0x08, 0x00};

Відповіді:


82

У Python 3 ми використовуємо bytesоб’єкт, також відомий як strу Python 2.

# Python 3
key = bytes([0x13, 0x00, 0x00, 0x00, 0x08, 0x00])

# Python 2
key = ''.join(chr(x) for x in [0x13, 0x00, 0x00, 0x00, 0x08, 0x00])

Мені зручніше користуватися base64модулем ...

# Python 3
key = base64.b16decode(b'130000000800')

# Python 2
key = base64.b16decode('130000000800')

Ви також можете використовувати літерали ...

# Python 3
key = b'\x13\0\0\0\x08\0'

# Python 2
key = '\x13\0\0\0\x08\0'

9
Для запису, замість того base64.b16decode(x), ви можете використовувати, просто x.decode("hex"). Це дозволяє вам обійтись принаймні на один імпорт. :)
Dolda2000

34

Просто використовуйте bytearray(Python 2.6 та новіші версії), який представляє змінну послідовність байтів

>>> key = bytearray([0x13, 0x00, 0x00, 0x00, 0x08, 0x00])
>>> key
bytearray(b'\x13\x00\x00\x00\x08\x00')

Індексація отримує та встановлює окремі байти

>>> key[0]
19
>>> key[1]=0xff
>>> key
bytearray(b'\x13\xff\x00\x00\x08\x00')

і якщо вам це потрібно як str(або bytesв Python 3), це так само просто

>>> bytes(key)
'\x13\xff\x00\x00\x08\x00'

Не так просто з 3.x; fubar = str(key); print(len(key), len(fubar))виробляє 6 38. У будь-якому випадку (1) "рядок" - це дуже розмита термінологія (2), якщо він хоче змінності, він може змінити свій оригінальний список
Джон Макін,

@John: Хороша думка щодо strіншої роботи bytearrayв Python 3 - виправлено. Я згадав про змінність, головним чином, щоб відрізнити її bytes, але справа також у тому, що вам не потрібно мати проміжний етап, щоб мати свої дані listвзагалі.
Скотт Гріффітс

2
Цілком ймовірно, що те, що дійсно потрібно ОП, щось на зразок struct.pack("<IH", 19, 8)...
Джон Мачин

5

Альтернатива, яка також має додаткову перевагу, що легко реєструє свої результати:

hexs = "13 00 00 00 08 00"
logging.debug(hexs)
key = bytearray.fromhex(hexs)

дозволяє робити прості заміни, наприклад:

hexs = "13 00 00 00 08 {:02X}".format(someByte)
logging.debug(hexs)
key = bytearray.fromhex(hexs)

3

Відповідь Дітріха - це, мабуть, саме те, що вам потрібно для того, що ви описуєте, надсилаючи байти, але більш близьким аналогом коду, який ви надали, наприклад, буде використання bytearrayтипу.

>>> key = bytearray([0x13, 0x00, 0x00, 0x00, 0x08, 0x00])
>>> bytes(key)
b'\x13\x00\x00\x00\x08\x00'
>>> 

1
Чудово bytearrayпідходить для Python 2.5 або ранішої версії, але вбудований - це справді шлях, якщо ви хочете, байтовий масив.
Скотт Гріффітс,

@TokenMacGuy: Ваша відповідь потребує ще 2 редагувань: (1) згадується, що модуль масиву (2) bytearray('b', ...)не працює. Або ви можете просто видалити його.
John Machin,

2
@ John: дякую, виправлено. Надалі просто вперед і внесіть зміни самостійно.
SingleNegationElimination
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.