github.com/scottcagno/storage@v1.8.0/pkg/bw/v3/header.go (about) 1 package v3 2 3 import ( 4 "encoding/binary" 5 "io" 6 ) 7 8 const ( 9 headerSize = 16 10 magicBytes = 0xBABE 11 kindActive = 0xA1 12 kindInactive = 0x00 13 ) 14 15 var buf [headerSize]byte 16 17 func clear(b *[headerSize]byte) { 18 *b = [headerSize]byte{} 19 } 20 21 type header struct { 22 magic uint16 23 kind uint16 24 crc32 uint32 25 size uint64 26 } 27 28 func (h *header) WriteTo(w io.Writer) (int64, error) { 29 binary.LittleEndian.PutUint16(buf[0:2], h.magic) // byte offset: 0-2 (2 bytes) 30 binary.LittleEndian.PutUint16(buf[2:4], h.kind) // byte offset: 2-4 (2 bytes) 31 binary.LittleEndian.PutUint32(buf[4:8], h.crc32) // byte offset: 4-8 (4 bytes) 32 binary.LittleEndian.PutUint64(buf[8:16], h.size) // byte offset: 8-16 (8 bytes) 33 n, err := w.Write(buf[:]) 34 if err != nil { 35 return int64(n), err 36 } 37 clear(&buf) // reset buffer 38 return int64(n), nil 39 } 40 41 func (h *header) ReadFrom(r io.Reader) (int64, error) { 42 n, err := r.Read(buf[:]) 43 if err != nil { 44 // reset buffer 45 clear(&buf) 46 return int64(n), err 47 } 48 h.magic = binary.LittleEndian.Uint16(buf[0:2]) // byte offset: 0-2 (2 bytes) 49 h.kind = binary.LittleEndian.Uint16(buf[2:4]) // byte offset: 2-4 (2 bytes) 50 h.crc32 = binary.LittleEndian.Uint32(buf[4:8]) // byte offset: 4-8 (4 bytes) 51 h.size = binary.LittleEndian.Uint64(buf[8:16]) // byte offset: 8-16 (8 bytes) 52 // reset buffer 53 clear(&buf) 54 return int64(n), nil 55 }