python-3.x 如何将bytes逐字节转换为有符号整数

cnh2zyt3  于 2023-02-01  发布在  Python
关注(0)|答案(4)|浏览(247)

我有一个bytes元素,字长为1,一个字节,内容可以是b'\xff\xff\x01',意思是[-1, -1, 1]
我想把它从bytes形式转换成int形式,逻辑上我的尝试是:

ints = [int.from_bytes(j, byteorder='little', signed=True) for j in b'\xff\xff\x01']

TypeError:无法将“int”对象转换为字节
但是for j in bytes()将bytes元素直接转换为int j,这是一个无符号的转换,我需要有符号的。我如何将我的bytes一个字节一个字节地转换为一个有符号的整数?

wwodge7n

wwodge7n1#

然而,这并不起作用,因为for j in bytes()将bytes元素直接转换为int j
正如你所注意到的,bytes已经是一个整数值的可迭代函数,如果我们有很多数据,那么保持bytes不变,并根据需要转换值会更节省内存,我们可以简单地通过数学运算将字节的无符号解释转换为相应的有符号表示:

def signed_byte(b):
    return b - 256 if b >= 128 else b

并 Package 索引过程:

def get_signed(data, index):
    return signed_byte(data[index])

如果我们想要或者需要提前完成所有的转换,那么这将直接提供给列表解析:

ints = [signed_byte(b) for b in b'\xff\xff\x01']

另一方面,我们可以重新定义这个问题:要 * 从原始数据中获取bytes对象作为子序列 *(类似于Python 2.x中的工作方式),我们可以使用1元素切片;或者我们可以将int值 Package 成一个新的bytes,前者要适应原始代码会比较麻烦,但后者很简单:

ints = [int.from_bytes(bytes([b]), byteorder='little', signed=True) for b in b'\xff\xff\x01']
u2nhd7ah

u2nhd7ah2#

另一种方法是使用Numpy:

>>> import numpy as np
>>> np.frombuffer(b'\xff\xff\x01', dtype=np.int8)
array([-1, -1,  1], dtype=int8)
okxuctiv

okxuctiv3#

这个解决方案是愚蠢的,但至少它的工作。

data = b'\xff\xff\x01'
result = list(struct.unpack('b' * len(data), data))
fwzugrvs

fwzugrvs4#

不知道还有没有用!刚才看到你们的评论了:)

ints = [int.from_bytes(bytes([j]), byteorder='little', signed=True) for j in b'\xff\xff\x01']

相关问题