如何在python中将字节字符串转换为int?
这样说:'y\xcc\xa6\xbb'
我想出了一个聪明/愚蠢的方法:
sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))
我知道一定有一些内置的或标准库中的东西可以更简单地实现这一点……
这与converting a string of hex digits不同,您可以使用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
我的hacky方法:
>>> 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,因此它可能取决于特定机器的容量和负载特性。
发布于 2009-01-14 20:52:39
您还可以使用struct模块来执行此操作:
>>> struct.unpack("<L", "y\xcc\xa6\xbb")[0]
3148270713L
发布于 2012-03-09 20:56:38
在Python 3.2及更高版本中,使用
>>> int.from_bytes(b'y\xcc\xa6\xbb', byteorder='big')
2043455163
或
>>> int.from_bytes(b'y\xcc\xa6\xbb', byteorder='little')
3148270713
根据您的字节串的endianness。
这也适用于任意长度的字节串整数,以及通过指定signed=True
来处理二进制补码有符号整数。请参阅docs for from_bytes
。
发布于 2009-01-14 21:42:53
正如Greg所说,如果您正在处理二进制值,则可以使用struct,但如果您只有一个“十六进制数字”,但在字节格式中,您可能希望将其转换为:
s = 'y\xcc\xa6\xbb'
num = int(s.encode('hex'), 16)
...this等同于:
num = struct.unpack(">L", s)[0]
...except,它可以工作于任意字节数。
https://stackoverflow.com/questions/444591
复制相似问题