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  }