public static ResourceRecord FromByteArray(byte[] data, int payloadBase, int offset, out int size) { int origOffset = offset; ResourceRecord rr = new ResourceRecord(); int nameDataSize; rr.name = DnsName.FromByteArray(data, payloadBase, offset, out nameDataSize); offset += nameDataSize; rr.meta = Serialization.Deserialize <Meta>(data, offset, Marshal.SizeOf <Meta>()); offset += Marshal.SizeOf <Meta>(); //the use of pointer complicates things int recordDataReadSize = 0; switch ((RecordType)rr.meta.rType) { case RecordType.A: rr.data = ResourceData.Address.FromByteArray(data, offset); recordDataReadSize = rr.data.Size; break; case RecordType.NS: case RecordType.PTR: case RecordType.CNAME: rr.data = ResourceData.NameEntry.FromByteArray((RecordType)rr.meta.rType, data, payloadBase, offset, out recordDataReadSize); break; case RecordType.MX: rr.data = ResourceData.MailExchange.FromByteArray(data, payloadBase, offset, out recordDataReadSize); break; case RecordType.SOA: rr.data = ResourceData.SOA.FromByteArray(data, payloadBase, offset, out recordDataReadSize); break; case RecordType.TXT: rr.data = ResourceData.Text.FromByteArray(data, offset, rr.meta.rdLength); recordDataReadSize = rr.data.Size; break; default: rr.data = ResourceData.Unknown.FromByteArray((UInt16)rr.meta.rType, data, offset, rr.meta.rdLength); recordDataReadSize = rr.data.Size; break; } offset += recordDataReadSize; size = offset - origOffset; return(rr); }
public static Question FromByteArray(byte[] arr, int payloadBase, int offset, out int size) { Question ret = new Question(); int nameDataSize; ret.name = DnsName.FromByteArray(arr, payloadBase, offset, out nameDataSize); offset += nameDataSize; ret.meta = Serialization.Deserialize <Meta>(arr, offset, 4); size = 4 + nameDataSize; return(ret); }
public static DnsName FromByteArray(byte[] arr, int payloadBase, int offset, out int size) { //these variables are used for size calculation int origIncOffset = offset; int origOffset = offset; bool pointerFollowed = false; DnsName ret = new DnsName(); int cmpLen; List <String> components = new List <string>(); while (true) { cmpLen = arr[offset++]; if (cmpLen >= 192) { //this is a pointer entry int newOffset = ((cmpLen & 63) << 8) | arr[offset++]; if (!pointerFollowed) { origIncOffset = offset; pointerFollowed = true; } offset = newOffset + payloadBase; } else { components.Add(Encoding.ASCII.GetString(arr, offset, cmpLen)); offset += cmpLen; } if (cmpLen == 0) { break; } } ret.domainComponents = components.ToArray(); ret.CalculateSize(); size = (pointerFollowed ? origIncOffset : offset) - origOffset; return(ret); }
public Question() { meta.qClass = 1; //fixed to "IN" name = new DnsName(); }