Как перебирать двухбайтовые срезы - PullRequest
0 голосов
/ 19 июня 2020

Каждый байтовый срез представляет собой ключ, я хочу перебрать от нижнего ключа к верхнему pkg https://golang.org/pkg/bytes/

Предположим, есть два байтовых среза lower :=[]byte upper :=[]byte как мне это сделать?

   for i:=lower;i<upper;i++ {

    }

Пример

 lower:= []byte{0,0,0,0,0,0}  // can be thought as 0 in decimal
 upper:= []byte{0,0,0,0,0,255} // can be thought as 255 in decimal
 //iterate over all numbers in between lower and upper
// {0,0,0,0,0,0} {0,0,0,0,0,1} ... {0,0,0,0,0,2} ..{0,0,0,0,0,255}
 for i:=0; i<=255;i++{

 }
//instead of converting to decimal iterate using byte arrays

В качестве альтернативы, как я могу разделить диапазон байтового массива (верхний-нижний) на меньшие диапазоны

\\eg 
   l := []byte{0,1}
   r := []byte{1,255}

разбить его на меньшие диапазоны

   l := []byte{0 , 1}
   l2:= []byte{x1,y1}
... 
   r:= []byte{1,255}

1 Ответ

1 голос
/ 19 июня 2020

Самый простой способ сделать это - просто интерпретировать байты как целое число с прямым порядком байтов. Поскольку в Go нет типа int48 (т. Е. Большого целого числа в шесть байтов), вам необходимо сначала расширить байтовые срезы начальными нулями, пока они не попадут в следующий по величине тип, int64 или uint64. Затем взаимодействуйте со стандартом для l oop и меняйте декодирование для каждой итерации:

package main

import (
        "encoding/binary"
        "fmt"
)

func main() {
        lower := []byte{0, 0, 0, 0, 0, 0}
        lowerInt := binary.BigEndian.Uint64(append([]byte{0, 0}, lower...))

        upper := []byte{0, 0, 0, 0, 0, 255}
        upperInt := binary.BigEndian.Uint64(append([]byte{0, 0}, upper...))

        buf := make([]byte, 8)
        for i := lowerInt; i <= upperInt; i++ {
                binary.BigEndian.PutUint64(buf, i)
                fmt.Println(buf[2:])
        }
}
// Output:
// [0 0 0 0 0 0]
// [0 0 0 0 0 1]
// ...
// [0 0 0 0 0 254]
// [0 0 0 0 0 255]

Попробуйте на игровой площадке: https://play.golang.org/p/86iN0V47nZi

...