wszystko. Zdaję sobie sprawę, co wydaje się bardzo dziwnym problemem. (Możliwe, że minęło dużo czasu, kiedy powinienem spać, a ja przeoczyłem coś oczywistego.)Konwertuj [8] bajt na uint64
Mam []byte
o długości 8 w wyniku dekodowania heksadecymalnego. Muszę wyprodukować uint64
, aby z niego skorzystać. Próbowałem użyć binary.Uvarint()
, od encoding/binary
, aby to zrobić, ale wydaje się, że używa tylko pierwszego bajtu w tablicy. Rozważmy następujący przykład.
package main
import (
"encoding/binary"
"fmt"
)
func main() {
array := []byte{0x00, 0x01, 0x08, 0x00, 0x08, 0x01, 0xab, 0x01}
num, _ := binary.Uvarint(array[0:8])
fmt.Printf("%v, %x\n", array, num)
}
Here it is on play.golang.org.
Kiedy który jest uruchamiany, to wyświetla num
jak 0
, chociaż w hex, powinno być 000108000801ab01
. Ponadto, jeśli przechwycimy drugą wartość z binary.Uvarint()
, jest to liczba bajtów odczytanych z bufora, która, według mojej wiedzy, powinna wynosić 8, mimo że faktycznie wynosi 1.
Czy interpretuję to błędnie? Jeśli tak, to co powinienem użyć?
Dzięki, wy wszyscy. :)
Można uniknąć Read() i bytes.Buffer po prostu robi 'num: = binary.LittleEndian.Uint64 (tablica)' –
@StephenWeinberg +1 nie wiedział. Zastąpiłem moje rozwiązanie, aby użyć twojego, co jest czystsze. –
Należy zauważyć, że te metody skrótu będą panikować, jeśli bufor wejściowy nie jest wystarczająco duży, aby pomieścić pełny żądany typ danych. Użycie podejścia 'binary.Read' daje ci' błąd' return, który możesz sprawdzić. – jimt