Пример #1
0
        public static ResourceRecord Parse(byte [] !buffer, ref int offset)
        {
            string name;

            if ((buffer[offset] & 0xc0) == 0xc0)
            {
                // Detected compression.  Name is at offset in
                // lower 14 bits of next 2 bytes.
                int start = NetworkBitConverter.ToInt16(buffer, offset);
                if (LabelEncoding.GetString(buffer, start & 0x3fff,
                                            out name) == 0)
                {
                    throw new InvalidDnsFormatException("name");
                }
                offset += 2;
            }
            else
            {
                int used = LabelEncoding.GetString(buffer, offset, out name);
                if (used == 0)
                {
                    throw new InvalidDnsFormatException("name");
                }
                offset += used;
            }

            ushort rType = NetworkBitConverter.ToUInt16(buffer, offset);

            offset += 2;

            ushort rClass = NetworkBitConverter.ToUInt16(buffer, offset);

            offset += 2;

            uint ttlSeconds = NetworkBitConverter.ToUInt32(buffer, offset);

            offset += 4;

            ushort rdataLength = NetworkBitConverter.ToUInt16(buffer, offset);

            offset += 2;

            byte [] rdata = new byte[rdataLength];
            Array.Copy(buffer, offset, rdata, 0, rdataLength);
            offset += rdataLength;

            return(new ResourceRecord(name, (Type)rType, (Class)rClass,
                                      ttlSeconds, rdata));
        }
Пример #2
0
        public static Query !Parse(byte [] !buffer, ref int offset)
        {
            string name;

            int used = LabelEncoding.GetString(buffer, offset, out name);

            if (used == 0)
            {
                throw new InvalidDnsFormatException("name");
            }
            offset += used;

            ushort qType = NetworkBitConverter.ToUInt16(buffer, offset);

            offset += 2;

            ushort qClass = NetworkBitConverter.ToUInt16(buffer, offset);

            offset += 2;

            return(new Query(name, (Type)qType, (Class)qClass));
        }