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

我正在尝试循环遍历小字节数组(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


}

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


慕田峪7331174
浏览 72回答 1
1回答

撒科打诨

将整数转换为字节数组该表示法基本上是以 256 为基数。第一个字节将是round number % 256. 然后将轮数除以256,如此重复,直到轮数变为0。由于 256 是一个特殊数字 (256 = 2 8 ),因此您可以使用按位运算进行计算。例如,余数等于 的位掩码0xff,除以 256 等于右移 8。big.Int另请注意,标准库中有一种类型表示(有符号)多精度整数。它有一个Int.Bytes()方法将绝对值作为大端字节片返回。这“几乎”是我们想要的,只是字节顺序不同。因此,您可以简单地将整数转换为big.Int(例如使用该Int.SetString()方法),获取其字节切片并将其反转。迭代值如果您不想转换单个整数而只想迭代后续值,请按如下所示操作:您从一个完整的零切片或数组开始。检查切片的第一个元素。如果 < 255,只需将其加一。完成迭代。如果是 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]...
打开App,查看更多内容
随时随地看视频慕课网APP