байтовый порядок байтов с помощью кодировки / двоичного кода в Go - PullRequest
5 голосов
/ 07 ноября 2011

Я получил сообщение об ошибке во время выполнения Write T1 binary.Read: invalid type main.T1

package main

import (
    "encoding/binary"
    "net"
)

type T1 struct {
    f1 [5]byte
    f2 int
}

func main() {
    conn, _ := net.Dial("tcp", ":12345")
    l1 := T1{[5]byte{'a', 'b', 'c', 'd', 'e'}, 1234}
    binary.Write(conn, binary.BigEndian, &l1)
}

Я хочу использовать функцию автоматического преобразования порядка байтов, как я могу это сделать?Кстати, есть ли более эффективный способ?

Ответы [ 2 ]

8 голосов
/ 08 ноября 2011

Использовать экспортированные поля фиксированного размера.Например,

package main

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

type T struct {
    F1 [5]byte
    F2 int32
}

func main() {
    var t1, t2 T
    t1 = T{[5]byte{'a', 'b', 'c', 'd', 'e'}, 1234}
    fmt.Println("t1:", t1)
    buf := new(bytes.Buffer)
    err := binary.Write(buf, binary.BigEndian, &t1)
    if err != nil {
        fmt.Println(err)
    }
    err = binary.Read(buf, binary.BigEndian, &t2)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println("t2:", t2)
}

Вывод:

t1: {[97 98 99 100 101] 1234}
t2: {[97 98 99 100 101] 1234}
2 голосов
/ 08 ноября 2011

Цитирование correctomundo из двоичное / кодирование документы:

Значение фиксированного размера - это арифметический тип фиксированного размера (int8, uint8,int16, float32, complex64, ...) или массив или структура, содержащие только значения фиксированного размера.

И, следовательно:

type T1 struct {
    f1 [5]uint8
    f2 int32
}

работает здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...