Як я можу представляти байтовий масив (як у Java з байтом []) у Python? Мені потрібно буде надіслати його по дроту з gevent.
byte key[] = {0x13, 0x00, 0x00, 0x00, 0x08, 0x00};
Відповіді:
У 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'
Просто використовуйте 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'
fubar = str(key); print(len(key), len(fubar))
виробляє 6 38
. У будь-якому випадку (1) "рядок" - це дуже розмита термінологія (2), якщо він хоче змінності, він може змінити свій оригінальний список
str
іншої роботи bytearray
в Python 3 - виправлено. Я згадав про змінність, головним чином, щоб відрізнити її bytes
, але справа також у тому, що вам не потрібно мати проміжний етап, щоб мати свої дані list
взагалі.
struct.pack("<IH", 19, 8)
...
Альтернатива, яка також має додаткову перевагу, що легко реєструє свої результати:
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)
Відповідь Дітріха - це, мабуть, саме те, що вам потрібно для того, що ви описуєте, надсилаючи байти, але більш близьким аналогом коду, який ви надали, наприклад, буде використання bytearray
типу.
>>> key = bytearray([0x13, 0x00, 0x00, 0x00, 0x08, 0x00])
>>> bytes(key)
b'\x13\x00\x00\x00\x08\x00'
>>>
bytearray
підходить для Python 2.5 або ранішої версії, але вбудований - це справді шлях, якщо ви хочете, байтовий масив.
bytearray('b', ...)
не працює. Або ви можете просто видалити його.
base64.b16decode(x)
, ви можете використовувати, простоx.decode("hex")
. Це дозволяє вам обійтись принаймні на один імпорт. :)