将字节转换为int?
Posted
技术标签:
【中文标题】将字节转换为int?【英文标题】:Convert bytes to int? 【发布时间】:2016-03-04 17:47:18 【问题描述】:我目前正在开发一个加密/解密程序,我需要能够将字节转换为整数。我知道:
bytes([3]) = b'\x03'
但我不知道如何做相反的事情。我做错了什么?
【问题讨论】:
如果你想一次转换多个变量,还有struct
模块。
Reading integers from binary file in Python、How to convert a string of bytes into an int in Python等可能重复
逆:b'\x03'[0]
如果你有一个字节对象var = b'abc'
,那么var[0]
将返回97
和var[1]
98
,以此类推。
【参考方案1】:
假设您至少使用 3.2,则有一个 built in for this:
int.from_bytes
(bytes
,byteorder
, *,signed=False
)...
参数
bytes
必须是字节类对象或可迭代对象 产生字节。
byteorder
参数确定用于表示 整数。如果byteorder
是"big"
,则最高有效字节位于 字节数组的开头。如果byteorder
是"little"
,则最 有效字节位于字节数组的末尾。请求 主机系统的本机字节顺序,使用sys.byteorder
作为字节 订单价值。
signed
参数表示是否使用二进制补码 表示整数。
## Examples:
int.from_bytes(b'\x00\x01', "big") # 1
int.from_bytes(b'\x00\x01', "little") # 256
int.from_bytes(b'\x00\x10', byteorder='little') # 4096
int.from_bytes(b'\xfc\x00', byteorder='big', signed=True) #-1024
【讨论】:
谢谢。int.from_bytes
和 ord(b'\x03')
对于单个字节/字符有区别吗?
我能想到的唯一区别是 int.from_bytes
可以将字节解释为有符号整数,如果你告诉它 - int.from_bytes(b'\xe4', "big", signed=True)
返回 -28,而 ord()
或 int.from_bytes
在无符号模式返回 228。
在调用时使用sys.byteorder
传递字节顺序。
@KrishnaOza - 这取决于。如果您正在转换在远程系统上编码的字节,例如因为您通过网络连接接收它们,则无法保证远程系统的本机字节顺序与您的匹配。这是一个重大的历史问题。【参考方案2】:
字节列表是可下标的(至少在 Python 3.6 中)。这样您就可以单独检索每个字节的十进制值。
>>> intlist = [64, 4, 26, 163, 255]
>>> bytelist = bytes(intlist) # b'@\x04\x1a\xa3\xff'
>>> for b in bytelist:
... print(b) # 64 4 26 163 255
>>> [b for b in bytelist] # [64, 4, 26, 163, 255]
>>> bytelist[2] # 26
【讨论】:
【参考方案3】:int.from_bytes( bytes, byteorder, *, signed=False )
不适用于我 我使用了这个网站的功能,效果很好
https://coderwall.com/p/x6xtxq/convert-bytes-to-int-or-int-to-bytes-in-python
def bytes_to_int(bytes):
result = 0
for b in bytes:
result = result * 256 + int(b)
return result
def int_to_bytes(value, length):
result = []
for i in range(0, length):
result.append(value >> (i * 8) & 0xff)
result.reverse()
return result
【讨论】:
这应该相当于做int.from_bytes(bytes, 'big')
【参考方案4】:
如果使用缓冲数据,我发现这很有用:
int.from_bytes([buf[0],buf[1],buf[2],buf[3]], "big")
假设buf
中的所有元素都是 8 位长。
【讨论】:
以上是关于将字节转换为int?的主要内容,如果未能解决你的问题,请参考以下文章