a go dns packet parser
at main 1.4 kB view raw
1package magna 2 3import ( 4 "encoding/binary" 5) 6 7// getU8 returns the first byte from a byte array at offset. 8func getU8(buf []byte, offset int) (uint8, int, error) { 9 nextOffset := offset + 1 10 if nextOffset > len(buf) { 11 return 0, len(buf), &BufferOverflowError{Length: len(buf), Offset: nextOffset} 12 } 13 14 return buf[offset], nextOffset, nil 15} 16 17// getU16 returns the bigEndian uint16 from a byte array at offset. 18func getU16(buf []byte, offset int) (uint16, int, error) { 19 nextOffset := offset + 2 20 if nextOffset > len(buf) { 21 return 0, len(buf), &BufferOverflowError{Length: len(buf), Offset: nextOffset} 22 } 23 24 return binary.BigEndian.Uint16(buf[offset:]), nextOffset, nil 25} 26 27// getU32 returns the bigEndian uint32 from a byte array at offset. 28func getU32(buf []byte, offset int) (uint32, int, error) { 29 nextOffset := offset + 4 30 if nextOffset > len(buf) { 31 return 0, len(buf), &BufferOverflowError{Length: len(buf), Offset: nextOffset} 32 } 33 34 return binary.BigEndian.Uint32(buf[offset:]), nextOffset, nil 35} 36 37// getSlice returns a slice of bytes from a byte array at an offset and of length. 38func getSlice(buf []byte, offset int, length int) ([]byte, int, error) { 39 nextOffset := offset + length 40 if nextOffset > len(buf) { 41 return nil, len(buf), &BufferOverflowError{Length: len(buf), Offset: nextOffset} 42 } 43 44 return buf[offset:nextOffset], nextOffset, nil 45}