Функция binary.Read
Функция binary.Read читает бинарные данные из источника
и сохраняет их в структуру данных. Первым параметром функция
принимает источник данных (реализующий интерфейс io.Reader),
вторым параметром - порядок байтов (binary.ByteOrder),
третьим параметром - указатель на структуру, в которую будут
записаны прочитанные данные.
Синтаксис
binary.Read(r io.Reader, order binary.ByteOrder, data any) error
Пример
Давайте прочитаем бинарные данные из буфера в структуру:
package 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)
}
Результат выполнения кода:
"ID: 42, Value: 3.14"
Пример
Давайте прочитаем бинарные данные с использованием порядка байтов BigEndian:
package 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)
}
Результат выполнения кода:
"Age: 30, Height: 175.5, Active: true"
Пример
Давайте прочитаем бинарные данные из файла:
package 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)
}
Результат выполнения кода:
"Config: {Version:1 Port:8080 Enabled:true Backup:3.14}"
Смотрите также
-
функцию
binary.Write,
которая записывает бинарные данные из структуры -
функцию
binary.Size,
которая возвращает размер структуры в байтах -
константу
binary.LittleEndian,
которая представляет порядок байтов от младшего к старшему -
константу
binary.BigEndian,
которая представляет порядок байтов от старшего к младшему