将Python int转换为大字节的字节串

我有一个非负int,我想有效地将​​其转换为包含相同数据的大端string。 例如,int 1245427(即0x1300F3)应该产生一个长度为3的string,其中包含三个字符,其字节值分别为0x13,0x00和0xf3。

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

我该怎么做呢?

你可以使用结构模块:

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

'>I'是格式string。 >意味着大端, I意思是无符号整型。 检查文档更多的格式字符。

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

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

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

可能最好的方法是通过内置的结构模块 :

 >>> 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:]步骤?

基于@pts的单源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' 
 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' 

请注意,对于这种方法,您需要指定正在创build的位串的长度。

在内部,这和Alex的答案几乎是一样的,但是如果你想对数据做更多的事情,模块还有很多额外的function。

我认为最简单的方法如下:

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

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