gpt4 book ai didi

arrays - 将 [32]byte 转换为 [8]uint32

转载 作者:IT王子 更新时间:2023-10-29 00:49:59 24 4
gpt4 key购买 nike

我在 [32]byte 中存储了 256 位。

我想将其转换为 [8]uint32,第一个 uint32 存储前四个字节等。

我将要编写一个函数,通过将位移动到正确的位置等来完成此操作,我想知道在 Go 中是否有更简单的方法来执行此操作?

最佳答案

使用binary.ByteOrder

encoding/binary包装使它变得容易,binary.ByteOrder 的值接口(interface)类型可用于从 byte slice 中读取 uint32 值。有一个 binary.LittleEndian 导出变量,您可以开箱即用。将其放入一个简单的 for 循环中以读取所有 8 个值:

data := [32]byte{1, 0, 0, 0, 2}
ints := [8]uint32{}

for i := 0; i < len(data); i += 4 {
ints[i/4] = binary.LittleEndian.Uint32(data[i:])
}

fmt.Println(ints)

输出(在 Go Playground 上尝试):

[1 2 0 0 0 0 0 0]

这当然适用于任意数量的字节(4 的倍数),而不仅仅是 32。

使用binary.Read()

另一个更短的替代方法是使用 binary.Read() :

func Read(r io.Reader, order ByteOrder, data interface{}) error

这当然需要 io.Reader , 你可以使用 bytes.NewBuffer() .这样转换就很简单了:

data := [32]byte{1, 0, 0, 0, 2}
ints := [8]uint32{}

err := binary.Read(bytes.NewBuffer(data[:]), binary.LittleEndian, &ints)

fmt.Println(ints, err)

输出(在 Go Playground 上尝试):

[1 2 0 0 0 0 0 0] <nil>

使用unsafe.Pointer

为了完整起见,这里还有另一种不安全的方式。由于数组在内存中按顺序排列,因此两个数组占用相同的大小。我们可以将输入的内存区域解释为输出类型的值:

data := [32]byte{1, 0, 0, 0, 2}
ints := [8]uint32{}

ints = *(*[8]uint32)((unsafe.Pointer)(&data))

fmt.Println(ints)

输出(在 Go Playground 上尝试):

[1 2 0 0 0 0 0 0]

这是解决您的任务的最有效和最不安全的方法。

在这种情况下,像介绍的那样做是安全的,但使用包 unsafe谨慎并作为最后的手段。许多其他看似非常相似的案例可能行不通。我们很“幸运”,因为我们有数组 输入是以小端字节顺序给出的,但是对于 slice 和/或不同的字节顺序,情况就不同了。上面介绍的其他 2 种方法更通用,适用于 slice 和数组。

关于arrays - 将 [32]byte 转换为 [8]uint32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43829976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com