将字节转换为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]将返回97var[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_bytesord(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?的主要内容,如果未能解决你的问题,请参考以下文章

Java bytebuffer 将三个字节转换为 int

将字节数组转换为 int

将 int 转换为字节 - Java 和 Actionscript 中的不同结果

Java 将 4 个字节转换为 int

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

将 int 文字分配给字节变量时是不是需要强制转换?