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

odd*_*ddy 3 type-conversion go

所以,我需要你的帮助.我在这个话题上找不到任何东西.Golang是一种新鲜出炉的语言,所以很难为像我这样的新手快速找到答案.

pet*_*rSO 5

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

这是将big-endian 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))
}
Run Code Online (Sandbox Code Playgroud)

输出:

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]
Run Code Online (Sandbox Code Playgroud)

要么

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]
Run Code Online (Sandbox Code Playgroud)

  • 应该注意,类型`int`不保证是32位.这是特定于实现的.目前的Go编译器都有它,但是语言规范没有强制要求,因此在将它转换为`uint32`时应该小心.*可能*是数据丢失. (2认同)