遍历字节数组的所有值

时间:2019-08-13 19:33:05

标签: go recursion

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

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

  

第一回合

     

值:[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

}

我似乎不知道该如何递归。

1 个答案:

答案 0 :(得分:2)

将舍入数转换为字节数组

该表示形式基本上是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]
...