Skip to content

Instantly share code, notes, and snippets.

@kylelemons
Created June 9, 2011 03:38
Show Gist options
  • Save kylelemons/1016001 to your computer and use it in GitHub Desktop.
Save kylelemons/1016001 to your computer and use it in GitHub Desktop.
decode rfc1035 header
type Header struct {
raw [6*2]byte
Opcode, Rcode, Z byte
ID, QD, NS, AN, AR []byte // 2 bytes each
QR, AA, TC, RD, RA bool
}
func decodeHeader(r io.Reader) *Header, os.Error {
h := &Header{}
n, err := r.Read(h.raw[:])
if n != len(h.raw) || err != nil {
if err == nil {
err = os.NewError("too few bytes for header")
}
return nil, err
}
h.ID = h.raw[:2]
h.QD = h.raw[4:6]
h.AN = h.raw[6:8]
h.NS = h.raw[8:10]
h.AR = h.raw[10:12]
h.Opcode = (h.raw[2]>>3) & 0xF
h.Rcode = h.raw[3] & 0xF
h.Z = (h.raw[3]>>4) & 0x7
h.QR = h.raw[2] & (1<<7) != 0
h.AA = h.raw[2] & (1<<2) != 0
h.TC = h.raw[2] & (1<<1) != 0
h.RD = h.raw[2] & (1<<0) != 0
h.RA = h.raw[3] & (1<<7) != 0
return h, nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment