【问题标题】:How to convert int[] to uint8[]如何将 int[] 转换为 uint8[]
【发布时间】:2011-08-05 22:02:27
【问题描述】:

所以,我需要你的帮助。我找不到关于该主题的任何内容。 Golang 是一门新鲜出炉的语言,所以对于像我这样的新手来说,很难快速找到答案。

【问题讨论】:

    标签: type-conversion go


    【解决方案1】:

    预先声明的 Go int 类型大小是特定于实现的,32 位或 64 位 (Numeric types)。

    这是一个将大端 ints 转换为 bytes (uint8s) 的示例。

    package main
    
    import (
        "encoding/binary"
        "fmt"
        "reflect"
    )
    
    func IntsToBytesBE(i []int) []byte {
        intSize := int(reflect.TypeOf(i).Elem().Size())
        b := make([]byte, intSize*len(i))
        for n, s := range i {
            switch intSize {
            case 64 / 8:
                binary.BigEndian.PutUint64(b[intSize*n:], uint64(s))
            case 32 / 8:
                binary.BigEndian.PutUint32(b[intSize*n:], uint32(s))
            default:
                panic("unreachable")
            }
        }
        return b
    }
    
    func main() {
        i := []int{0, 1, 2, 3}
        fmt.Println("int size:", int(reflect.TypeOf(i[0]).Size()), "bytes")
        fmt.Println("ints:", i)
        fmt.Println("bytes:", IntsToBytesBE(i))
    }
    

    输出:

    int size: 4 bytes
    ints: [0 1 2 3]
    bytes: [0 0 0 0 0 0 0 1 0 0 0 2 0 0 0 3]
    

    int size: 8 bytes
    ints: [0 1 2 3]
    bytes: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 3]
    

    【讨论】:

    • 我期待一个不那么繁琐的例子(由于我的盲人相信 Go 有一些用于这类任务的例程)。但是你的例子对我来说非常好,谢谢。
    • 需要注意的是int类型不保证是32位。这是特定于实现的。当前的 Go 编译器都有它,但语言规范并没有强制要求它,因此在将其转换为 uint32 时应该小心。 可能有数据丢失。
    • 还值得注意的是,当使用显式大小的整数时,可以编写更少繁琐的代码。您可以使用 binary.Write 而不是在循环中调用 binary.BigEndian.PutUint32。
    • @jimt 似乎 Go 1.1 将不再只有 32 位。也将支持 64 位整数。现在你知道了。见go.googlecode.com/hg/doc/…
    • 确实如此。 @peterSO 的答案也将被更新,因为 IntsToBytesBE 假设 int 是 32 位宽。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2016-03-12
    相关资源
    最近更新 更多