<分区>
有什么方法可以使用 Go 压缩和解压 int 吗?
例如这个数字 10 字符 4251658154
我想压缩(使大小变小,例如我的 10 char int 到 5 char 字节)int 或任何类型的数据类型接受数字而不是解压缩它
标签 go
<分区>
有什么方法可以使用 Go 压缩和解压 int 吗?
例如这个数字 10 字符 4251658154
我想压缩(使大小变小,例如我的 10 char int 到 5 char 字节)int 或任何类型的数据类型接受数字而不是解压缩它
最佳答案
如果您只想以不同的幅度压缩任意数字,您正在寻找的是 varint 编码。如果数字很小(<127),它可以用一个字节编码,依此类推。示例 from the docs:
主要包
import (
"encoding/binary"
"fmt"
)
func main() {
buf := make([]byte, binary.MaxVarintLen64)
for _, x := range []int64{-65, -64, -2, -1, 0, 1, 2, 63, 64} {
n := binary.PutVarint(buf, x)
fmt.Printf("%x\n", buf[:n])
}
}
// Prints:
// 8101
// 7f
// 03
// 01
// 00
// 02
// 04
// 7e
// 8001
但是,如果您想以高效的方式表示 IPV4 地址,只需将它们编码为无符号 int32 数字即可。
import (
"bytes"
"encoding/binary"
"fmt"
"net"
)
func IPToNumber(addr string) (uint32, error) {
var n uint32
err := binary.Read(bytes.NewBuffer(net.ParseIP(addr).To4()), binary.BigEndian, &n)
return n, err
}
func main() {
if n, err := IPToNumber("255.255.255.255"); err == nil {
fmt.Printf("%x", n)
}
}
关于go - 如何在 Go 中压缩 int(数字),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56421464/