Ответ 1
Вы можете использовать модуль struct:
import struct
print struct.pack('>I', your_int)
'>I'
- это строка формата. >
означает big endian и I
означает unsigned int. Проверьте документацию для большего количества символов формата.
У меня есть неотрицательный int, и я хотел бы эффективно преобразовать его в строку большого конца, содержащую те же данные. Например, int 1245427 (который равен 0x1300F3) должен содержать строку длиной 3, содержащую три символа, значения байтов которых равны 0x13, 0x00 и 0xf3.
My ints находятся на шкале от 35 (base-10) цифр.
Как мне это сделать?
Вы можете использовать модуль struct:
import struct
print struct.pack('>I', your_int)
'>I'
- это строка формата. >
означает big endian и I
означает unsigned int. Проверьте документацию для большего количества символов формата.
В 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'
Это быстро и работает для небольших и (произвольных) больших 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'
Вероятно, лучший способ - через встроенный 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:]
?
Совместимость с одним источником 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'
def tost(i):
result = []
while i:
result.append(chr(i&0xFF))
i >>= 8
result.reverse()
return ''.join(result)
Используя модуль bitstring:
>>> bitstring.BitArray(uint=1245427, length=24).bytes
'\x13\x00\xf3'
Обратите внимание, что для этого метода вам нужно указать длину в битах создаваемой битовой строки.
Внутри это почти то же самое, что и ответ Alex, но у модуля есть много дополнительных функций, если вы хотите сделать больше с вашими данными.
Самый короткий путь, я думаю, следующий:
import struct
val = 0x11223344
val = struct.unpack("<I", struct.pack(">I", val))[0]
print "%08x" % val
Это преобразует целое число в целое число с байтом.