Функция binary.Read

Функция binary.Read читает бинарные данные из источника и сохраняет их в структуру данных. Первым параметром функция принимает источник данных (реализующий интерфейс io.Reader), вторым параметром - порядок байтов (binary.ByteOrder), третьим параметром - указатель на структуру, в которую будут записаны прочитанные данные.

Синтаксис

gobinary.Read(r io.Reader, order binary.ByteOrder, data any) error

Пример

Давайте прочитаем бинарные данные из буфера в структуру:

gopackage main

import (
  "bytes"
  "encoding/binary"
  "fmt"
)

func main() {
  type Data struct {
    ID  uint32
    Value float64
  }

  buf := new(bytes.Buffer)
  binary.Write(buf, binary.LittleEndian, uint32(42))
  binary.Write(buf, binary.LittleEndian, float64(3.14))

  var res Data
  err := binary.Read(buf, binary.LittleEndian, &res)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Printf("ID: %d, Value: %.2f\n", res.ID, res.Value)
}

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

go"ID: 42, Value: 3.14"

Пример

Давайте прочитаем бинарные данные с использованием порядка байтов BigEndian:

gopackage main

import (
  "bytes"
  "encoding/binary"
  "fmt"
)

func main() {
  type Person struct {
    Age  uint16
    Height float32
    Active bool
  }

  buf := new(bytes.Buffer)
  binary.Write(buf, binary.BigEndian, uint16(30))
  binary.Write(buf, binary.BigEndian, float32(175.5))
  binary.Write(buf, binary.BigEndian, bool(true))

  var res Person
  err := binary.Read(buf, binary.BigEndian, &res)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Printf("Age: %d, Height: %.1f, Active: %t\n", res.Age, res.Height, res.Active)
}

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

go"Age: 30, Height: 175.5, Active: true"

Пример

Давайте прочитаем бинарные данные из файла:

gopackage main

import (
  "encoding/binary"
  "fmt"
  "os"
)

func main() {
  type Config struct {
    Version   uint32
    Port    uint16
    Enabled   bool
    Backup  float32
  }

  file, err := os.Open("config.bin")
  if err != nil {
    fmt.Println("Error opening file:", err)
    return
  }
  defer file.Close()

  var res Config
  err = binary.Read(file, binary.LittleEndian, &res)
  if err != nil {
    fmt.Println("Error reading:", err)
    return
  }

  fmt.Printf("Config: %+v\n", res)
}

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

go"Config: {Version:1 Port:8080 Enabled:true Backup:3.14}"

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

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