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); }