我有一个由3个字节组成的片(以LE排序),它表示一个带符号的整数,我想将它转换成任何整数类型,最好是int32,然后再转换回它自己.

b := []byte{0x01, 0x00, 0x80}

我try 使用big.Int来实现这一点,但它的SetBytes()Bytes()方法似乎只适用于无符号整数类型,而不考虑big.Int实例也可以存储有符号整数类型.

下面是一个与我正在try 做的事情相当的Python:

b = b"\x01\x00\x80"
i = int.from_bytes(b, "little", signed=True)
b_again = int.to_bytes("little", signed=True)

编辑:这道题不是Go []byte to Little/Big-Endian Signed Integer or Float?题的翻版.我试着把答案应用到那里,但他们的结果出乎意料.请看我的第一条 comments .

推荐答案

我有一个由3个字节组成的片(以LE排序),它表示一个带符号的整数,我想将它转换成任何整数类型,最好是int32,然后再转换回它自己.


package main

import "fmt"

func ByteLE3ToInt24(b []byte) int32 {
    i := uint32(b[0])<<8 | uint32(b[1])<<16 | uint32(b[2])<<24
    return int32(i) >> 8
}

func Int24ToByteLE3(i int32) []byte {
    b := make([]byte, 3)
    b[0] = byte(i)
    b[1] = byte(i >> 8)
    b[2] = byte(i >> 16)
    return b
}

func main() {
    b := []byte{0x01, 0x00, 0x80} // Negative
    fmt.Println(b)
    fmt.Println(ByteLE3ToInt24(b))
    fmt.Println(Int24ToByteLE3(ByteLE3ToInt24(b)))
    fmt.Println()
    b = []byte{0x01, 0x00, 0x00} // Positive
    fmt.Println(b)
    fmt.Println(ByteLE3ToInt24(b))
    fmt.Println(Int24ToByteLE3(ByteLE3ToInt24(b)))
}

https://go.dev/play/p/d_XTZWx83Zp

[1 0 128]
-8388607
[1 0 128]

[1 0 0]
1
[1 0 0]

Go相关问答推荐

在Golang中,@LATEST和@UPGRADE特殊查询有什么不同?

禁用Golang中的终端

从使用Golang otelmux检测的Otel跟踪中获取trace_id

Golang在不写入磁盘的情况下为jpeg图像生成一致的哈希

如何确定泛型类型在运行时是否可比较?

正则表达式模式,确保至少一个字符与其他条件一起存在

如何将 DirName 和 serial 添加到 X509v3 Authority Key Identifier

Kubo,来自 IpfsNode.Bootstrap 的无效内存地址或零指针取消引用

当我的 go build 成功时,如何修复我的 docker build 失败? Dockerfile 包括 go mod 下载

我无法使用反向代理更改主机标头

如何以干净的方式在中间件中注入 repo 或服务?

GoLang: gocui 边框 colored颜色

如何在 gocql 中设置最大池大小?

Golang 通过接口反映/迭代{}

如何过滤来自 fsnotify 的重复系统消息

go-libp2p - 从流中接收字节

如果 transaction.Commit 对带有 postgres 连接的 SQL 失败,您是否需要调用 transaction.RollBack

go:识别重新定义标志的包

Golang grpc go.mod 问题

Beego - 我需要context.Context而不是 Beego 上下文