IPv4-адрес BigEndian ByteOrder

#go

#Вперед

Вопрос:

Я немного смущен тем, как двоичный пакет Go в стандартной библиотеке представляет целое число в []byte порядке бигендиана.

Для справки, ниже приведен метод в стандартной библиотеке, с которым я путаюсь:

     func (bigEndian) PutUint32(b []byte, v uint32) {
    _ = b[3] // early bounds check to guarantee safety of writes below
    b[0] = byte(v >> 24)
    b[1] = byte(v >> 16)
    b[2] = byte(v >> 8)
    b[3] = byte(v)
}
  

Предположим, у меня есть адрес IPv4, представленный в виде 32-разрядного целого числа без знака, такого как 236194314

При бигендианском упорядочении это должно быть представлено в виде 4-байтового фрагмента: [10 10 20 14]

Однако PutUint32 сохраняет самый значимый байт в массиве в последнем индексе b[3] = byte(v) , что приводит к [14 20 10 10] .

Есть ли какое-либо конкретное объяснение этому?

Комментарии:

1. b[3]=byte(v) (10) — младший значащий байт.

Ответ №1:

Число 236194314 равно 0E 14 0A 0A в шестнадцатеричном формате. Таким образом, самый значимый байт действительно равен 14d. Ваш адрес IPv4, представленный в виде 32-битного целого числа без знака, приходит в уже перевернутом байте.

Проблема возникла перед преобразованием в байтовый фрагмент.