我有一个非负整数,想要高效地将其转换为包含相同数据的大端字符串。例如,整数1245427(即0x1300F3)应该生成长度为3的字符串,其中包含三个字符,其字节值分别为0x13、0x00和0xf3。
我的整数在35位(十进制)数字的范围内。
我应该如何做?
我有一个非负整数,想要高效地将其转换为包含相同数据的大端字符串。例如,整数1245427(即0x1300F3)应该生成长度为3的字符串,其中包含三个字符,其字节值分别为0x13、0x00和0xf3。
我的整数在35位(十进制)数字的范围内。
我应该如何做?
在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'
signed=True
。 - gerrit(length + 7) // 8
这部分是不是等同于 math.ceil(length / 8)
?如果是的话,使用后者会更清晰明了。 - Jezzamonn.bit_length()
的大小是合理的(大约需要一千万亿位才会有问题),那么它们是相同的,这意味着n
将变得非常大。在我的情况下,可读性比性能提高更重要,而且数字永远不会那么大。 - Jezzamon你可以使用 struct 模块:
import struct
print(struct.pack('>I', your_int))
'>I'
是一个格式化字符串。其中>
表示大端序(big endian),I
表示无符号整数(unsigned int)。更多格式字符,请查看相关文档。
这种方法速度快,适用于小整数和(任意)大整数:
def Dump(n):
s = '%x' % n
if len(s) & 1:
s = '0' + s
return s.decode('hex')
print repr(Dump(1245427)) #: '\x13\x00\xf3'
if len(s) & 1
替换为 if len(s) % 2
(如果十六进制字符数是奇数,则两者都为 true),并且将 '%x' % n
替换为 '{0:x}'.format(n)
(这两个都将数字格式化为十六进制字符串)。 - Abbafei可能最好的方式是通过内置的struct模块:
>>> 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)
我认为最简单的方法是:
import struct
val = 0x11223344
val = struct.unpack("<I", struct.pack(">I", val))[0]
print "%08x" % val
这将把一个整数转换为字节交换后的整数。
>>> bitstring.BitArray(uint=1245427, length=24).bytes
'\x13\x00\xf3'
pwntools
,这是专门为软件黑客而创建的工具。import pwntools
x2 = p32(x1)