Преобразование нескольких байтов в массиве в другой тип в Go - PullRequest
1 голос
/ 30 ноября 2010

Я только вчера начал с Go, поэтому заранее прошу прощения за глупый вопрос.

Представьте, что у меня есть байтовый массив, такой как:

func main(){
    arrayOfBytes := [10]byte{1,2,3,4,5,6,7,8,9,10}
}

А что, если я захочу взять первые четыре байта этого массива и использовать его как целое число?Или, может быть, у меня есть структура, которая выглядит следующим образом:

type eightByteType struct {
    a uint32
    b uint32
}

Могу ли я легко взять первые 8 байтов моего массива и превратить его в объект типа eightByteType?

Я понимаю, что это два разных вопроса, но я думаю, что они могут иметь схожие ответы.Я просмотрел документацию и не нашел хорошего примера для достижения этой цели.

Возможность преобразовать блок байтов во что-то - это одна из вещей, которые мне действительно нравятся в C. Надеюсь, я все еще могу сделать это в Go.

1 Ответ

2 голосов
/ 30 ноября 2010

Посмотрите на encoding/binary, а также bytes.Buffer

TL; версия DR:

import (
    "encoding/binary"
    "bytes"
)

func main() {
    var s eightByteType
    binary.Read(bytes.NewBuffer(array[:]), binary.LittleEndian, &s)
}

Несколько вещейчтобы отметить здесь: мы передаем array [:], в качестве альтернативы вы могли бы вместо этого объявить ваш массив как срез ([]byte{1, 2, 3, 4, 5}) и позволить компилятору беспокоиться о размерах и т. д., и eightByteType не будет работать как есть (IIRC), потому чтоbinary.Read не затрагивает приватные поля.Это будет работать:

type eightByteType struct {
    A, B uint32
}
...