You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:35:27