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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 05:16:14