首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将字节串转换为int?

如何将字节串转换为int?
EN

Stack Overflow用户
提问于 2009-01-14 20:46:18
回答 9查看 322.4K关注 0票数 164

如何在python中将字节字符串转换为int?

这样说:'y\xcc\xa6\xbb'

我想出了一个聪明/愚蠢的方法:

代码语言:javascript
复制
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的方法更快:

代码语言:javascript
复制
>>> 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方法:

代码语言:javascript
复制
>>> Timer("sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))").timeit()
2.8819329738616943

进一步更新:

有人在评论中问,导入另一个模块有什么问题。好吧,导入一个模块并不一定便宜,看一下:

代码语言:javascript
复制
>>> Timer("""import struct\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""").timeit()
0.98822188377380371

包括导入模块的成本几乎否定了这种方法的所有优势。我相信这将只包括在整个基准测试运行中导入一次它的费用;看看当我每次强制它重新加载时会发生什么:

代码语言:javascript
复制
>>> Timer("""reload(struct)\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""", 'import struct').timeit()
68.474128007888794

不用说,如果每次导入都要大量执行此方法,那么从比例上来说,这就不是什么问题了。这也可能是i/o开销,而不是cpu,因此它可能取决于特定机器的容量和负载特性。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-01-14 20:52:39

您还可以使用struct模块来执行此操作:

代码语言:javascript
复制
>>> struct.unpack("<L", "y\xcc\xa6\xbb")[0]
3148270713L
票数 111
EN

Stack Overflow用户

发布于 2012-03-09 20:56:38

在Python 3.2及更高版本中,使用

代码语言:javascript
复制
>>> int.from_bytes(b'y\xcc\xa6\xbb', byteorder='big')
2043455163

代码语言:javascript
复制
>>> int.from_bytes(b'y\xcc\xa6\xbb', byteorder='little')
3148270713

根据您的字节串的endianness

这也适用于任意长度的字节串整数,以及通过指定signed=True来处理二进制补码有符号整数。请参阅docs for from_bytes

票数 338
EN

Stack Overflow用户

发布于 2009-01-14 21:42:53

正如Greg所说,如果您正在处理二进制值,则可以使用struct,但如果您只有一个“十六进制数字”,但在字节格式中,您可能希望将其转换为:

代码语言:javascript
复制
s = 'y\xcc\xa6\xbb'
num = int(s.encode('hex'), 16)

...this等同于:

代码语言:javascript
复制
num = struct.unpack(">L", s)[0]

...except,它可以工作于任意字节数。

票数 68
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/444591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档