将Python int转换为big-endian字节串

时间:2009-05-10 20:24:01

标签: python

我有一个非负的int,我想有效地将​​它转换为包含相同数据的big-endian字符串。例如,int 1245427(0x1300F3)应该生成一个长度为3的字符串,其中包含三个字符,其字节值为0x13,0x00和0xf3。

我的整数是35(基数为10)的数字。

我该怎么做?

9 个答案:

答案 0 :(得分:42)

您可以使用struct模块:

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

'>I'是格式字符串。 >表示大端,I表示unsigned int。查看文档以获取更多格式字符。

答案 1 :(得分:39)

在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'

答案 2 :(得分:13)

这很快,适用于小型和(任意)大型整数:

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

答案 3 :(得分:7)

可能最好的方法是通过内置的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:]步骤?

答案 4 :(得分:7)

基于@pts' answer的单源Python 2/3兼容版本:

#!/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'

答案 5 :(得分:6)

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

答案 6 :(得分:3)

使用bitstring模块:

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

请注意,对于此方法,您需要指定要创建的位串的位长度。

在内部,这与Alex的答案几乎相同,但如果您想对数据做更多的工作,该模块还有许多额外的功能。

答案 7 :(得分:3)

我认为最短的方法如下:

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

这会将整数转换为字节交换的整数。

答案 8 :(得分:0)

使用pwntools(为软件黑客创建的工具)非常容易

(具有讽刺意味的是,我偶然发现了该线程并在此处尝试了解决方案,直到我意识到pwntools中存在转换功能)

import pwntools

x2 = p32(x1)