如何在Python中将字节字符串转换为整数?
比如这样:'y\xcc\xa6\xbb'
我想出了一个聪明/愚蠢的方法:
sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))
我知道标准库中一定有内置的方法可以更简单地做到这一点......
这与将十六进制数字字符串转换为整数的操作不同,对于前者,您可以使用int(xxx,16),但我想要将实际字节值的字符串转换为整数。
更新:
我有点喜欢James的答案,因为它不需要导入其他模块,但Greg的方法更快:
>>> from timeit import Timer
>>> Timer('struct.unpack("<L", "y\xcc\xa6\xbb")[0]', 'import struct').timeit()
0.36242198944091797
>>> Timer("int('y\xcc\xa6\xbb'.encode('hex'), 16)").timeit()
1.1432669162750244
我用的笨拙方式:
>>> Timer("sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))").timeit()
2.8819329738616943
进一步更新:
有人在评论中问导入另一个模块的问题。好吧,导入模块并不一定是廉价的,请看:
>>> Timer("""import struct\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""").timeit()
0.98822188377380371
将导入模块的成本计算在内几乎抵消了该方法的所有优势。我认为这只会包括整个基准运行中导入一次的费用;看看当我每次强制重新加载它时会发生什么:
>>> Timer("""reload(struct)\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""", 'import struct').timeit()
68.474128007888794
毋庸置疑,如果您对这个方法进行了大量的执行,并且仅有一个导入,则此问题在成比例上变得不那么重要。这也可能是I/O成本而非CPU成本,因此可能取决于特定机器的容量和负载特性。
int.from_bytes
)在我的电脑上比struct.unpack
表现更好。我认为它更易读。 - magu_