Categorygithub.com/markwinter/unpacket
repositorypackage
0.0.0-20241030211234-898ac9fe0efa
Repository: https://github.com/markwinter/unpacket.git
Documentation: pkg.go.dev

# Packages

No description provided by the author

# README

Unpacket

Unpacket provides functionality to unpack and pack byte slices into structs using an unpacket struct tag. This was mostly written to simplify network protocol parsing e.g. https://github.com/markwinter/go-finproto

This currently only supports fixed-size packets/fields. Support for the final field to be variable length is incoming.

Features

  • Parse a byte array into a struct.
  • Ability to pack a struct back into a byte array.

Installation

To use Unpacket

go get github.com/markwinter/unpacket

Usage

Add an unpack struct tag to your struct fields with offset and length tag fields.

The supported fields are variants of int uint bool time.Duration string

Unpack a byte slice

package main

import (
	"fmt"
	"log"
    
	"github.com/markwinter/unpacket"
)

type EventCode uint8

type SystemEvent struct {
	Timestamp      time.Duration `unpack:"offset=5,length=6"`
	StockLocate    uint16        `unpack:"offset=1,length=2"`
	TrackingNumber uint16        `unpack:"offset=3,length=2"`
	EventCode      EventCode     `unpack:"offset=11,length=1"`
}

func main() {
    data := []byte{83,0,0,0,0,0,162,215,245,12,16,83}
    
    systemEvent := &SystemEvent{}
    err := unpacket.Unpack(data, binary.BigEndian, systemEvent)
    if err != nil {
        log.Fatalf("failed unpacking data: %w", err)
    }
    
    fmt.Printf("%+v", systemEvent)
    // &{Timestamp:11m39.4078628s StockLocate:0 TrackingNumber:0 EventCode:83}
}

Pack a struct into a byte slice

package main

import (
	"fmt"
	"log"
    
	"github.com/markwinter/unpacket"
)

type EventCode uint8

type SystemEvent struct {
	Timestamp      time.Duration `unpack:"offset=5,length=6"`
	StockLocate    uint16        `unpack:"offset=1,length=2"`
	TrackingNumber uint16        `unpack:"offset=3,length=2"`
	EventCode      EventCode     `unpack:"offset=11,length=1"`
}

func main() {
    systemEvent := &SystemEvent{
        // ...   
    }

    data, err := unpacket.Pack(binary.BigEndian, systemEvent)
    if err != nil {
        log.Fatalf("failed packing data: %w", err)
    }
    
    fmt.Printf("%+v", data)
    // [0 0 0 0 0 0 162 215 245 12 16 83]
}