72 lines
1.6 KiB
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,
|
|
}
|
|
}
|