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

Преобразование Python int в строку байтов большого числа байтов

У меня есть неотрицательный int, и я хотел бы эффективно преобразовать его в строку большого конца, содержащую те же данные. Например, int 1245427 (который равен 0x1300F3) должен содержать строку длиной 3, содержащую три символа, значения байтов которых равны 0x13, 0x00 и 0xf3.

My ints находятся на шкале от 35 (base-10) цифр.

Как мне это сделать?

4b9b3361

Ответ 1

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

import struct
print struct.pack('>I', your_int)

'>I' - это строка формата. > означает big endian и I означает unsigned int. Проверьте документацию для большего количества символов формата.

Ответ 2

В Python 3.2+ вы можете использовать int.to_bytes:

Если вы не хотите указывать размер

>>> n = 1245427
>>> n.to_bytes((n.bit_length() + 7) // 8, 'big') or b'\0'
b'\x13\x00\xf3'

Если вы не возражаете, указав размер

>>> (1245427).to_bytes(3, byteorder='big')
b'\x13\x00\xf3'

Ответ 3

Это быстро и работает для небольших и (произвольных) больших ints:

def Dump(n): 
  s = '%x' % n
  if len(s) & 1:
    s = '0' + s
  return s.decode('hex')
print repr(Dump(1245427))  #: '\x13\x00\xf3'

Ответ 4

Вероятно, лучший способ - через встроенный struct module:

>>> import struct
>>> x = 1245427
>>> struct.pack('>BH', x >> 16, x & 0xFFFF)
'\x13\x00\xf3'
>>> struct.pack('>L', x)[1:]  # could do it this way too
'\x13\x00\xf3'

В качестве альтернативы - и я бы обычно не рекомендовал этого, потому что он подвержен ошибкам - вы можете сделать это "вручную", сдвинув и chr():

>>> x = 1245427
>>> chr((x >> 16) & 0xFF) + chr((x >> 8) & 0xFF) + chr(x & 0xFF)
'\x13\x00\xf3'

Из любопытства, зачем вам всего три байта? Обычно вы собираете такое целое число в полные 32 бита (C unsigned long) и используете struct.pack('>L', 1245427), но пропустите шаг [1:]?

Ответ 5

Совместимость с одним источником Python 2/3 на основе @pts 'answer:

#!/usr/bin/env python
import binascii

def int2bytes(i):
    hex_string = '%x' % i
    n = len(hex_string)
    return binascii.unhexlify(hex_string.zfill(n + (n & 1)))

print(int2bytes(1245427))
# -> b'\x13\x00\xf3'

Ответ 6

def tost(i):
  result = []
  while i:
    result.append(chr(i&0xFF))
    i >>= 8
  result.reverse()
  return ''.join(result)

Ответ 7

Используя модуль bitstring:

>>> bitstring.BitArray(uint=1245427, length=24).bytes
'\x13\x00\xf3'

Обратите внимание, что для этого метода вам нужно указать длину в битах создаваемой битовой строки.

Внутри это почти то же самое, что и ответ Alex, но у модуля есть много дополнительных функций, если вы хотите сделать больше с вашими данными.

Ответ 8

Самый короткий путь, я думаю, следующий:

import struct
val = 0x11223344
val = struct.unpack("<I", struct.pack(">I", val))[0]
print "%08x" % val

Это преобразует целое число в целое число с байтом.