Golang эквивалент Python’s struct.pack / struct.unpack

#go

#Вперед

Вопрос:

В Python, используя struct модуль, я могу сделать что-то вроде этого, чтобы получить упакованное представление значения в виде строки:

 import struct
print struct.pack('L', 64)
"@x00x00x00x00x00x00x00"
struct.unpack('L', '@x00x00x00x00x00x00x00')
(64,)
  

Я хотел бы сделать что-то подобное в Go, за исключением того, что мне немного неясно, как это сделать. Я знаю, что могу сделать что-то вроде этого:

 import (
    "encoding/binary"
    "fmt"
)

bs := make([]byte, 8)
binary.PutUvarint(bs, uint64(64))
fmt.Printf("%s", bs)
"@"
  

Но это совсем другое и, вероятно, не то, чего я хочу.

Ответ №1:

Да, «кодирование / двоичный код» — это то, что вы хотите, вам просто не нужен формат переменной длины.

https://play.golang.org/p/e81LuPO_JR

 bs := make([]byte, 8)
binary.LittleEndian.PutUint64(bs, uint64(64))
fmt.Printf("%#vn", bs)

i := binary.LittleEndian.Uint64(bs)
fmt.Println(i)
  

Комментарии:

1. @cliquot-the-dog, JFTR имеет в виду, что encoding/binary он способен маршалировать и разархивировать двоичные данные из значений / в переменные пользовательских struct типов (путем reflect изменения их структуры), поэтому часто можно «распаковывать» сложные двоичные строки прямо в пользовательские struct файлы и обратно.

2. @xaav: Я не уверен, что вы имеете в виду, этот пример сам декодирует ненулевой аргумент.

Ответ №2:

Есть пара интересных решений.

1-й — это суть, которой легко следовать, и ее ограничения очевидны:

https://gist.github.com/cloveryume/9a59e8d77f5836f11720#file-golang_struct_packed-go

2-й — это пакет, который пытается выполнить задание по упаковке:

https://github.com/lunixbochs/struc