如何将int[]转换为uint8[]

3

所以,我需要你的帮助。我在这个话题上找不到任何相关资料。Golang是一门新生的编程语言,因此对于像我这样的新手来说很难快速找到答案。

1个回答

5

预声明的Go int 类型大小是实现特定的,可以是32位或64位 (数字类型)。

这里有一个将大端序的 int 转换为 byte (uint8) 的示例。

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]

1
我原本预期的示例会更简单(因为我盲目地相信Go有一些常规任务的例程)。但是您提供的示例对我来说完全有效,谢谢。 - oddy
2
需要注意的是,类型int不能保证为32位。这取决于具体实现。当前的Go编译器都有它,但语言规范并没有强制要求,因此在转换为uint32时应该小心。可能会出现数据丢失。 - jimt
值得注意的是,当使用明确大小的整数时,可以编写更简洁的代码。您可以使用binary.Write而不是在循环中调用binary.BigEndian.PutUint32。 - Evan Shaw
1
@jimt 看起来 Go 1.1 不再只支持32位,还将支持64位整数。现在你知道了。请参见 https://go.googlecode.com/hg/doc/go1.1.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+hacker-news-feed-200+(Hacker+News+200)。 - Ztyx
确实。@peterSO的答案也需要更新,因为IntsToBytesBE假定int宽度为32位。 - jimt
修改为 int 类型大小为32位或64位。 - peterSO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接