Подтвердить что ты не робот

Python 2,3 Преобразовать целое число в "байты"

Самый короткий путь, который я нашел:

n = 5

#Python 2
s = str(n)
i = int(s)

#Python 3
s = bytes(str(n),"ascii")
i = int(s)

Меня особенно интересуют два фактора: читаемость и мобильность. Второй метод для Python 3 является уродливым. Тем не менее, я думаю, что это может быть обратно совместимо.

Есть ли более короткий, более чистый способ, который я пропустил? В настоящее время я делаю лямбда-выражение, чтобы исправить его с помощью новой функции, но, возможно, это лишнее.

4b9b3361

Ответ 1

Чтобы преобразовать строку в последовательность байтов в Python 2 или Python 3, вы используете метод string encode. Если вы не указали параметр кодирования 'ascii', который всегда будет достаточно хорош для числовых цифр.

s = str(n).encode()

В Python 2 str(n) уже создаются байты; encode выполнит двойное преобразование, поскольку эта строка неявно преобразуется в Unicode и обратно в байты. Это ненужная работа, но она безвредна и полностью совместима с Python 3.


Выше был ответ на вопрос, который действительно был задан, который должен был создать строку из байтов ASCII. Но поскольку люди продолжают приходить сюда, пытаясь получить ответ на другой вопрос, я тоже отвечу на этот вопрос. Если вы хотите преобразовать 10 в b'10', используйте приведенный выше ответ, но если вы хотите преобразовать 10 в b'\x0a\x00\x00\x00', продолжайте читать.

Модуль struct был специально предоставлен для преобразования различных типов и их двоичного представления в виде последовательности байтов. Преобразование из типа в байты выполняется с помощью struct.pack. Там параметр формата fmt, который определяет, какое преобразование он должен выполнить. Для 4-байтового целого числа это будет i для подписанных чисел или i для неподписанных чисел. Дополнительные возможности см. В таблице символов и см. порядок байтов, размер и таблицу выравнивания для параметров, когда вывод больше одного байта.

Ответ 2

Вы можете использовать struct pack:

In [11]: struct.pack(">I", 1)
Out[11]: '\x00\x00\x00\x01'

" > " - это byte-order (big-endian), а символ "я" - символ . Поэтому вы можете быть конкретным, если хотите сделать что-то еще:

In [12]: struct.pack("<H", 1)
Out[12]: '\x01\x00'

In [13]: struct.pack("B", 1)
Out[13]: '\x01'

Это работает одинаково для обоих python 2 и python 3.

Примечание: обратная операция (байты для int) может быть выполнена с помощью unpack.

Ответ 3

Я нашел единственный надежный переносимый метод

bytes(bytearray([n]))

Просто байты ([n]) не работают в python 2. Взятие живописного маршрута через bytearray кажется единственным разумным решением.

Ответ 5

от int до байта:

bytes_string = int_v.to_bytes( lenth, endian )

где lenth равен 1/2/3/4...., а endian может быть "большим" или "маленьким"

сформировать байты для int:

data_list = list( bytes );