Переменная binary.BigEndian

Переменная binary.BigEndian предоставляет доступ к методам интерфейса ByteOrder для работы с порядком байтов от старшего к младшему (big-endian). Big-endian означает, что самый значимый байт числа записывается первым. Эта переменная часто используется при чтении и записи бинарных данных, особенно при работе с сетевыми протоколами, файловыми форматами и низкоуровневым вводом-выводом.

Синтаксис

gobinary.BigEndian.Uint16(b []byte) uint16
binary.BigEndian.Uint32(b []byte) uint32
binary.BigEndian.Uint64(b []byte) uint64
binary.BigEndian.PutUint16(b []byte, v uint16)
binary.BigEndian.PutUint32(b []byte, v uint32)
binary.BigEndian.PutUint64(b []byte, v uint64)

Пример

Давайте прочитаем 16-битное целое число из среза байтов в порядке big-endian:

gopackage main

import (
  "encoding/binary"
  "fmt"
)

func main() {
  data := []byte{0x12, 0x34}
  res := binary.BigEndian.Uint16(data)
  fmt.Println(res)
}

Результат выполнения кода:

go4660

В данном примере байты 0x12 и 0x34 интерпретируются как число 0x1234, что в десятичной системе равно 4660.

Пример

Давайте запишем 32-битное число в срез байтов в порядке big-endian:

gopackage main

import (
  "encoding/binary"
  "fmt"
)

func main() {
  num := uint32(0x12345678)
  buf := make([]byte, 4)
  binary.BigEndian.PutUint32(buf, num)
  fmt.Printf("%x", buf)
}

Результат выполнения кода:

go"12345678"

В результате мы получили срез байтов, где старший байт 0x12 идет первым, а младший 0x78 - последним.

Пример

Давайте сравним чтение 64-битного числа в big-endian и little-endian:

gopackage main

import (
  "encoding/binary"
  "fmt"
)

func main() {
  data := []byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}

  big := binary.BigEndian.Uint64(data)
  little := binary.LittleEndian.Uint64(data)

  fmt.Printf("Big-endian: %x\n", big)
  fmt.Printf("Little-endian: %x\n", little)
}

Результат выполнения кода:

go"Big-endian: 102030405060708"
"Little-endian: 807060504030201"

Как видно из примера, при чтении в big-endian порядок байтов сохраняется, а при чтении в little-endian байты интерпретируются в обратном порядке.

Смотрите также

  • переменную binary.LittleEndian,
    которая предоставляет функции для работы с порядком байтов от младшего к старшему
  • переменную binary.NativeEndian,
    которая предоставляет функции для работы с порядком байтов текущей архитектуры
  • функцию binary.Read,
    которая читает структурированные бинарные данные из ридера
  • функцию binary.Write,
    которая записывает структурированные бинарные данные в ридер