为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕田峪7331174 2023-07-10 17:45:21
我正在尝试循环遍历小字节数组(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}我似乎不知道如何递归这个。
查看完整描述

1 回答

?
撒科打诨

TA贡献1934条经验 获得超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,只需将其加一。完成迭代。

  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]

...


查看完整回答
反对 回复 2023-07-10
  • 1 回答
  • 0 关注
  • 65 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信