如何在3字节切片与有符号整数类型间相互转换?
3字节小端序有符号整数与int32的互转实现
我有一个3字节的小端序(LE)切片,表示有符号整数,需要将其转换为int32类型,之后再转换回原3字节切片。尝试过用big.Int实现,但它的SetBytes()和Bytes()方法仅处理无符号整数逻辑,不符合需求。
Python的等效实现如下:
b = b"\x01\x00\x80" i = int.from_bytes(b, "little", signed=True) b_again = i.to_bytes(3, "little", signed=True)
实现思路
- 3字节LE转int32:先按小端序把3字节拼接成24位数值,检查最高位(第23位)是否为1(符号位),若是则对int32的高8位进行符号扩展,确保有符号数的正确转换。
- int32转回3字节LE:直接按小端序取出int32的低3字节即可,符号位会自然保留在第3字节的最高位。
Go代码实现
package main import "fmt" // ThreeBytesLEToInt32 将3字节小端序有符号整数转为int32 func ThreeBytesLEToInt32(b []byte) int32 { if len(b) != 3 { panic("输入必须是3字节切片") } // 小端序拼接为24位无符号值 val := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 // 检查24位值的符号位,若为1则扩展为32位有符号数 if val&0x800000 != 0 { val |= 0xFF000000 } return int32(val) } // Int32ToThreeBytesLE 将int32转为3字节小端序有符号整数切片 func Int32ToThreeBytesLE(i int32) []byte { val := uint32(i) return []byte{ byte(val), byte(val >> 8), byte(val >> 16), } } func main() { b := []byte{0x01, 0x00, 0x80} // 转换为int32 i := ThreeBytesLEToInt32(b) fmt.Printf("转换后的int32值: %d\n", i) // 输出-8388607,与Python结果一致 // 转回3字节切片 bAgain := Int32ToThreeBytesLE(i) fmt.Printf("转回后的切片: %#v\n", bAgain) // 输出[]byte{0x1, 0x0, 0x80},与原切片一致 }
代码说明
ThreeBytesLEToInt32:通过小端拼接得到24位无符号值后,判断符号位是否为1,若是则将高8位全部置1,完成32位有符号数的符号扩展。Int32ToThreeBytesLE:将int32转为uint32后,按小端顺序提取低3字节,自动保留原数的符号信息。
内容的提问来源于stack exchange,提问作者Roj
相关产品推荐
相关产品推荐

