gpt4 book ai didi

go - 遍历字节数组的所有值

转载 作者:IT王子 更新时间:2023-10-29 01:40:20 25 4
gpt4 key购买 nike

我试图遍历一个小字节数组(64 字节)的所有值。我想增加数字时钟的方式,从索引 0 开始,转到 0-255,然后增加索引 1,重复。我知道这可能是一种递归方法,但我无法理解其中的逻辑。

所以基本上,对于一个 4 字节的数组(为了方便更小)

Round 1

value: [0 0 0 0]

Round 256

value [ 255 0 0 0]

Round 256

value [ 0 1 0 0 ]

Round 257

value [ 1 1 0 0 ]

我目前拥有的:

func allValues() {
currentPlaceIndex := 0
content := make([]uint8, 64)
max := 256

for i := 0; i < max; i++ {
content[currentPlaceIndex] = uint8(i)
}
fmt.Println(content)
content[currentPlaceIndex] = 0

}

我似乎不知道如何递归这个。

最佳答案

将轮数转换为字节数组

此表示基本上是基数 256 基数。第一个字节将是 round number % 256。然后将轮数除以256,重复直到轮数变为0。

由于 256 是一个特殊的数字(256 = 28),您可以使用位运算来计算。例如。余数等于用 0xff 进行位掩码,除以 256 等于右移 8。

另请注意,有一个 big.Int在标准库中键入表示(带符号的)多精度整数。它有一个 Int.Bytes()返回绝对值作为 big-endian 字节 slice 的方法。这“几乎”是我们想要的,只是字节顺序不同。因此,您可以简单地将整数转换为 big.Int(例如使用 Int.SetString() 方法),获取其字节 slice 并将其反转。

遍历值

如果您不想转换单个轮数,而只是迭代后续值,那么可以这样做:

  1. 您从完整的零 slice 或数组开始。

  2. 检查 slice 的第一个元素。如果 < 255,只需将其递增 1。完成迭代。

  3. 如果它是 255,将其置零,并尝试对第二个元素执行相同操作:转到步骤 2。

所以如果你有一个状态,这就是你如何计算下一个状态:

func next(data []byte) {
for idx := range data {
if data[idx] < 255 {
data[idx]++
return
}
data[idx] = 0
}
fmt.Println("overflow")
}

这是你可以测试它的方法:

data := make([]byte, 64)
for iter := 0; iter < 600; iter++ {
next(data)
fmt.Println(data)
}

这将输出(在 Go Playground 上尝试):

[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
...
[255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
...
[255 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
...

关于go - 遍历字节数组的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57484245/

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