我正在尝试遍历一个小字节数组(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()
方法),获取其字节片并将其反转。
迭代值
如果您不想转换单个整数,而只是迭代后续值,请按照以下步骤操作:
您从完整的零切片或数组开始。
检查切片的第一个元素。如果<255,只需将其递增 1 即可。完成迭代。
如果是 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]
...