//преобразование имени
        //доменное имя, есть набор подимен
        //парсер должен сделать следующее
        //1. прочитать имя и разбить на зоны
        //2. найти максимальное подимя в дереве суффиксов
        //3. заменить его на ссылку
        //4. остальное написать

        public static byte[] GenerateName(string name, int addr, SuffixTree names)
        {
            var bytes = new List <byte>();
            var codes = GenerateZones(name);

            int reference = 0;
            int suffix    = suffix = names.ReadNameAndUpdate(name, ref reference, addr);

            foreach (var bs in codes)
            {
                bytes.Add((byte)bs.Length);
                bytes.AddRange(bs);
            }

            if (suffix > 0)
            {
                bytes.RemoveRange(bytes.Count - suffix, suffix);
                bytes.AddRange(To2Bytes(192 * 256 + reference));
            }

            return(bytes.ToArray());
        }
        public static byte[] GenerateRequest(Question quest, short id, SuffixTree names)
        {
            var request = new List <byte>();

            request.AddRange(To2Bytes(id));
            request.Add(1);                //0... - request, .0000... - opcode (std. query), ...0.. - isn't truncated, ...0. - in't fragmented, ...1 - recursion
            request.Add(0);                //0... - server supports recursion, .000... - reserved, ...0000 - RCODE (NOError)
            request.AddRange(To2Bytes(1)); //questions count
            request.AddRange(To2Bytes(0)); //answers count
            request.AddRange(To2Bytes(0)); //authoritive RRs count
            request.AddRange(To2Bytes(0)); //additional RRs count

            //simple single question
            int trash = 0;

            names.ReadNameAndUpdate(quest.Domain, ref trash, request.Count);
            request.AddRange(EncodeDName(quest.Domain)); //name

            request.AddRange(To2Bytes((int)quest.Type)); //Type
            request.AddRange(To2Bytes(1));               //Class (IN)

            return(request.ToArray());
        }