go - 如何在 Go 中压缩 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/

相关文章:

go - Swagger参数问题

macos - Golang x509 无法在 Mac OS X 上加载系统根错误

amazon-web-services - 尝试在Golang中初始化SqsEvent记录

go - 如何在 golang 中格式化日期和时间以在 neo4j 查询中使用它?

go - new() 和 "regular"分配有区别吗?

go - 给定两个绝对 URI,找到它们之间的相对路径

go - Go 方法中的默认值

string - 对于文件中的每个单词,查找当前单词是否多次出现

cmake - 如何让 CMake 与 go 编程语言一起工作?

go - 如何在 docker 运行时获取参数?