循环遍历字节数组的所有值



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

所以基本上,对于 4 字节数组(为方便起见,更小)

第 1 轮

值:[

0 0 0 0]第256轮

值 [ 255 0 0 0]

第256轮

值 [ 0 1 0 0 ]

第 257 轮

值 [ 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 = 2 8),因此可以使用按位运算进行计算。 例如,余数等于0xff位掩码,除以 256 等于右移8

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

迭代值

如果您不想转换单个整数,而只是迭代后续值,请按照以下步骤操作:

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

  2. 检查切片的第一个元素。如果<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]
...

最新更新