如何将bytearray中的单个字节转为有符号整数?解决TypeError报错
如何将bytearray中的无符号字节转换为有符号整数?
我有一个包含4个字节的bytearray,每个字节代表范围在-128到127之间的有符号字节,请问该如何转换?
代表值-1、15、1和-2的bytearray通过以下代码创建:
data = bytearray() data.extend([0xff, 0x0f, 0x01, 0xfe])
我尝试用以下代码进行转换:
import struct my_signed_byte_0 = struct.unpack("b", data[0])[0] my_signed_byte_1 = struct.unpack("b", data[1])[0] my_signed_byte_2 = struct.unpack("b", data[2])[0] my_signed_byte_3 = struct.unpack("b", data[3])[0]
但这会触发错误:
TypeError: a bytes-like object is required, not 'int'
出现该错误的原因是**data[0]**返回的是int类型,而非bytes-like对象。
解决方法
方法1:修正struct.unpack的调用方式
struct.unpack要求第二个参数是bytes或bytearray这类bytes-like对象,所以可以把单个int值包装成bytes后再传入:
import struct my_signed_byte_0 = struct.unpack("b", bytes([data[0]]))[0] my_signed_byte_1 = struct.unpack("b", bytes([data[1]]))[0] my_signed_byte_2 = struct.unpack("b", bytes([data[2]]))[0] my_signed_byte_3 = struct.unpack("b", bytes([data[3]]))[0]
更高效的方式是一次性解析整个bytearray,避免多次调用:
import struct # 用"4b"表示解析4个有符号字节 signed_values = struct.unpack("4b", data) # signed_values 结果为 (-1, 15, 1, -2) my_signed_byte_0, my_signed_byte_1, my_signed_byte_2, my_signed_byte_3 = signed_values
方法2:手动补码转换
根据有符号字节的补码规则,当无符号值大于127时,减去256即可得到对应的负数:
def to_signed_byte(unsigned_byte): return unsigned_byte - 256 if unsigned_byte > 127 else unsigned_byte my_signed_byte_0 = to_signed_byte(data[0]) my_signed_byte_1 = to_signed_byte(data[1]) my_signed_byte_2 = to_signed_byte(data[2]) my_signed_byte_3 = to_signed_byte(data[3])
内容的提问来源于stack exchange,提问作者YBrush
相关产品推荐
相关产品推荐

