#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-битного целого числа без знака, приходит в уже перевернутом байте.
Проблема возникла перед преобразованием в байтовый фрагмент.