将字节转换为整数?

162

我目前正在开发一个加密/解密程序,需要将字节转换为整数。我知道:

bytes([3]) = b'\x03'

然而我找不到如何进行反向操作,我做错了什么吗?


3
如果您想一次转换多个变量,可以使用 struct 模块。 - tdelaney
可能是重复的问题,与以下问题相似:如何在Python中从二进制文件中读取整数如何在Python中将字节串转换为整数等。 - jww
2
逆转:b'\x03'[0] - djvg
如果你有一个字节对象 var = b'abc',那么 var[0] 将返回 97var[1] 返回 98,以此类推。 - Have a nice day
8个回答

266

假设你至少使用的是3.2版本以上,Python提供了一个内置方法int.from_bytes可以将字节转换为整数:

int.from_bytes( bytes, byteorder, *, signed=False )

...

要转换的参数bytes可以是类字节对象或生成字节的可迭代对象。

byteorder参数决定用于表示整数的字节顺序。如果byteorder"big",则最高有效字节位于字节数组的开头;如果是"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

3
int.from_bytesord(b'\x03')在处理单个字节/字符时有区别吗? - Bill
5
我唯一能想到的区别是,如果你告诉int.from_bytes使用有符号整数解释字节,则它可以将字节解释为有符号整数。例如,int.from_bytes(b'\xe4', "big", signed=True)会返回-28,而使用无符号模式的ord()int.from_bytes则返回228。 - Peter DeGlopper
在调用时使用 sys.byteorder 传递字节顺序。 - Krishna Oza
3
这取决于情况。如果你正在转换从远程系统编码的字节,比如因为你通过网络连接接收它们,那么不能保证远程系统的本地字节顺序与你的相匹配。这是一个重要的历史问题。 - Peter DeGlopper

21
    字节列表是可下标的(至少在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 

8

list() 可以用于将字节转换为整数(在 Python 3.7 中可行):

list(b'\x03\x04\x05')
[3, 4, 5]

不适用于Python 2.7。 - Westranger
1
这个答案是完全有效的,因为它在Python 3.7中可以工作。 - Dmitriy Work
此外,如果您需要一个不可变的序列,tuple()也可以使用。 - howdoicode

2
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

1
这应该等同于执行int.from_bytes(bytes, 'big') - A Kareem

1

如果需要处理缓冲数据,我发现以下内容很有用:

int.from_bytes([buf[0],buf[1],buf[2],buf[3]], "big")

假设buf中的所有元素都是8位长。

1

将字节转换为位字符串

format(int.from_bytes(open('file','rb').read()),'b')

-1

在寻找现有解决方案时,我偶然发现了一个老问题。我自己做了一个并想分享,因为它允许您从字节列表中创建一个32位整数,并指定偏移量。

def bytes_to_int(bList, offset):
    r = 0
    for i in range(4):
        d = 32 - ((i + 1) * 8)
        r += bList[offset + i] << d
    return r

-1
#convert bytes to int 
    def bytes_to_int(value):
        return int.from_bytes(bytearray(value), 'little')

    bytes_to_int(b'\xa231')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接