public static Message FromBytes(byte[] bytes, int index, int count) { Message message = new Message(); using (MemoryStream stream = new MemoryStream(bytes, index, count)) using (BinaryReader reader = new BinaryReader(stream)) { // ID message.TransactionID = reader.ReadNetworkOrderUInt16(); // Flags // QR, OPCODE, AA, TC, RD byte flags = reader.ReadByte(); // QR message.QueryResponse = flags.GetBit(7); // OPCODE message.Opcode = (byte)((flags >> 3) & 0x0f); // AA message.AuthoritativeAnswer = flags.GetBit(2); // TC message.Truncated = flags.GetBit(1); // RD message.RecursionDesired = flags.GetBit(0); // RA, Z, AD, CD, RCODE flags = reader.ReadByte(); // RA message.RecursionAvailable = flags.GetBit(7); // Z // (zero bit) // AD message.AuthenticData = flags.GetBit(5); // CD message.CheckingDisabled = flags.GetBit(4); // RCODE message.ResponseCode = (byte)(flags & 0x0f); // Number of questions and answer records ushort questions, answers, authorityRecords, additionalRecords; // Number of Questions questions = reader.ReadNetworkOrderUInt16(); // Number of Answers answers = reader.ReadNetworkOrderUInt16(); // Number of Authority Records authorityRecords = reader.ReadNetworkOrderUInt16(); // Number of Additional Records additionalRecords = reader.ReadNetworkOrderUInt16(); // Read each Question and Resource Record // Questions while (questions-- > 0) { message.Questions.Add(Question.FromBinaryReader(reader)); } // Answers while (answers-- > 0) { message.AnswerRecords.Add(ResourceRecord.FromBinaryReader(reader)); } // Authority Records while (authorityRecords-- > 0) { message.AnswerRecords.Add(ResourceRecord.FromBinaryReader(reader)); } // Additional Records while (additionalRecords-- > 0) { message.AdditionalRecords.Add(ResourceRecord.FromBinaryReader(reader)); } } return(message); }