1
0
Protocol/types/fixed.go

72 lines
1.6 KiB
Go

package types
import (
"io"
)
// FixedString represents a fixed-length string field
type FixedString struct {
Data []byte
Size int
}
// NewFixedString creates a new fixed string with the specified size
func NewFixedString(size int) *FixedString {
return &FixedString{
Data: make([]byte, size),
Size: size,
}
}
// SetString sets the string value, truncating or padding as needed
func (f *FixedString) SetString(s string) {
copy(f.Data, []byte(s))
// Pad with zeros if string is shorter than fixed size
for i := len(s); i < f.Size; i++ {
f.Data[i] = 0
}
}
// String returns the string value, trimming null bytes
func (f *FixedString) String() string {
// Find first null byte
for i, b := range f.Data {
if b == 0 {
return string(f.Data[:i])
}
}
return string(f.Data)
}
// Serialize writes the fixed string to a writer
func (f *FixedString) Serialize(w io.Writer) error {
_, err := w.Write(f.Data)
return err
}
// SerializeToBytes writes the fixed string to a byte slice
func (f *FixedString) SerializeToBytes(dest []byte, offset *uint32) {
copy(dest[*offset:], f.Data)
*offset += uint32(f.Size)
}
// Deserialize reads a fixed string from a reader
func (f *FixedString) Deserialize(r io.Reader) error {
_, err := io.ReadFull(r, f.Data)
return err
}
// FixedArray represents a fixed-size array of primitive types
type FixedArray[T any] struct {
Data []T
Size int
}
// NewFixedArray creates a new fixed array with the specified size
func NewFixedArray[T any](size int) *FixedArray[T] {
return &FixedArray[T]{
Data: make([]T, size),
Size: size,
}
}