如何将字节逐字节转换为带符号整数



我有一个bytes元素。我的单词大小是1,一个字节。内容可以是b'xffxffx01',意思是[-1, -1, 1]

我想把它从字节形式转换成int表示形式。从逻辑上讲,我的尝试是:

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

TypeError:无法将"int"对象转换为字节

但是,这不起作用,因为for j in bytes()将字节元素直接转换为intj。然而,这是一个无符号转换,我需要有符号。如何将我的字节逐字节转换为带符号整数。

但是,这不起作用,因为for j in bytes()将字节元素直接转换为intj

正如您所注意到的,bytes已经是可在整数值上迭代的。如果我们有很多数据,那么保持bytes的原样并根据需要转换值会更有效。我们可以简单地进行数学运算,将字节的无符号解释转换为相应的有符号表示:

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

并包装索引过程:

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

如果我们想或需要提前完成所有转换,这将直接影响列表理解:

ints = [signed_byte(b) for b in b'xffxffx01']

另一方面,我们可以重新定义这个问题:要从原始数据中获得一个bytes对象作为子序列(就像2.x中的工作方式一样(,我们可以使用一个单元素切片;或者我们可以将CCD_ 11的值包装成新的CCD_。前者很难适应原始代码,但后者很琐碎:

ints = [int.from_bytes(bytes([b]), byteorder='little', signed=True) for b in b'xffxffx01']

另一种方法,使用Numpy:

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

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

data = b'xffxffx01'
result = list(struct.unpack('b' * len(data), data))

我不知道它是否还有帮助!我刚才看到你的评论:(

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

最新更新