別のアプリケーションからのバイナリメッセージをいくつか逆シリアル化する必要があります。私はrestruct.ioを使用したいが、メッセージ構造のいくつかのフィールドは "非標準"のビット数(5ビット、3ビット、... 10ビット...)を使用する。非標準サイズのフィールドを逆シリアル化する方法は?
このタイプの構造体を処理する方法はありますか?私は何の成功もなく時間を探していますので、どんな助けも非常に歓迎されるでしょう。事前
で
おかげで私は私の質問を明確にする例を与えることをしようとウィル。コードを考える:
package main
import (
"encoding/binary"
"fmt"
restruct "gopkg.in/restruct.v1"
)
type MessageType uint8
const (
MessageTypeOne MessageType = iota + 1
MessageTypeTwo
MessageTypeThree
)
// Message is the data to deserialize from the binary stream
type Message struct {
Length uint32 `struct:"uint32"` // message size in bytes (including length)
Type MessageType `struct:"uint8"`
Version uint8 `struct:"uint8:4"` // Just need 4 bits
Subversion uint8 `struct:"uint8:2"` // just need 2 bits
Optional uint8 `struct:"uint8:1"` // just one bit --> '1' means next field is NOT present
NodeName string ``
ANumber uint16 `struct:"uint16:10"` // just need 10 bits
}
// (length(4)+type(1)+(version(4bits)+Subversion(2bits)+Optional(1bit))) = 6 bytes
// need 32bit alignment
func main() {
var inStream = []byte{0x08, // just 8 bytes needed
0x01, // messge type = MessageTypeOne
0x4a, // Version=0100 Subversion=10 Optional=1 ANumber = 0 (MSB bit)
0x00, 0x60, // ANumber(000 0000 011) Padding = 0 0000 for 32 bits alignment
}
var msg Message
err := restruct.Unpack(inStream, binary.BigEndian, &msg)
if err != nil {
panic(err)
}
fmt.Println(msg)
// Expected:
// msg.Length = 8
// msg.Type = 1
// msg.Version = 4
// msg.Subversion = 2
// msg.Optional = 1
// msg.NodeName = ""
// msg.ANumber = 3
}
私は...これは私の質問を明確にします
希望をTCP接続からあるinStreamを受信すると、バイナリデータをデシリアライズし、期待値とのメッセージ構造体を得ることになるでしょう。
再び感謝;)
がそれを処理するためのいくつかの方法がありますが、我々は何を知っている必要はありませあなたが援助を必要としているかどうかです。あなたがしていることの例を挙げてください。 – JimB