如何在Python中将字节字符串转换为int?
像这样说:'y\xcc\xa6\xbb'
我想出了一个聪明/愚蠢的方法:
sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))
我知道必须有一些内置的或标准库中的东西可以更简单地执行此操作......
这不同于转换一串十六进制数字 https://stackoverflow.com/questions/209513/convert-hex-string-to-int-in-python您可以使用 int(xxx, 16),但我想转换实际字节值的字符串。
UPDATE:
我有点喜欢詹姆斯的回答,因为它不需要导入另一个模块,但格雷格的方法更快:
>>> 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,因此它可能取决于特定机器的容量和负载特征。