Пример использования функция для кодирования и декодирования объектов C# в Bencode.

            // Базовые объекты кодирования.
            object i    = 234;
            var str     = "Это строка, которая будет закодирована.";
            var ilist   = new List<int> { 1, 2, 3, 4, -1, -2, 0 };
            var idict   = new SortedDictionary<string, int>();

            idict.Add("a", 1);
            idict.Add("b", -1);
            idict.Add("c", 0);

            // Контейнеры содержащие базовые объекты кодирования 
            // или аналогичные контейнеры ... содержащие базовые объекты кодирования. 
            var list    = new List<object>();
            var dict    = new SortedDictionary<string, object>();

            list.Add(str);
            list.Add(ilist);
            list.Add(idict);

            dict.Add("L1", "3465.2568356");
            dict.Add("L2", list);

            // Производим кодирование объектов.
            var code_i      = BitTorrent.Bencode.encode.Encode(i.ToString()); // !!
            var code_str    = BitTorrent.Bencode.encode.Encode(str);
            var code_ilist  = BitTorrent.Bencode.encode.Encode(ilist);
            var code_idict  = BitTorrent.Bencode.encode.Encode(idict);
            var code_list   = BitTorrent.Bencode.encode.Encode(list);
            var code_dict   = BitTorrent.Bencode.encode.Encode(dict);

            // Проверим успешность кодирования.
            #region
            if (code_i == null)
            {
                Console.WriteLine("Encode i error!");
                Console.ReadKey();
                return;
            }
            if (code_str == null)
            {
                Console.WriteLine("Encode str error!");
                Console.ReadKey();
                return;
            }
            if (code_ilist == null)
            {
                Console.WriteLine("Encode ilist error!");
                Console.ReadKey();
                return;
            }
            if (code_idict == null)
            {
                Console.WriteLine("Encode idict error!");
                Console.ReadKey();
                return;
            }
            if (code_list == null)
            {
                Console.WriteLine("Encode list error!");
                Console.ReadKey();
                return;
            }
            if (code_dict == null)
            {
                Console.WriteLine("Encode dict error!");
                Console.ReadKey();
                return;
            }
            Console.WriteLine("Encode success.\n");
            #endregion

            // Создадим буффер, в котором сольём все закодированные объекты.

            /* Необходимо создать внутри библиотеки обработку незавешённых объектов
             * с выдачей в случае такого объекта указателя на null.
             * **/
            var code_buffer = code_i + code_str + code_ilist + code_idict + code_list + code_dict;

            // Выведем результаты кодирования и слияния в консоль.
            Console.WriteLine("i        : {0}\n", code_i);
            Console.WriteLine("str      : {0}\n", code_str);
            Console.WriteLine("ilist    : {0}\n", code_ilist);
            Console.WriteLine("idict    : {0}\n", code_idict);
            Console.WriteLine("list     : {0}\n", code_list);
            Console.WriteLine("dict     : {0}\n", code_dict);
            Console.WriteLine("buffer   : {0}\n", code_buffer);

            // Раскодируем полученные коды.
            var dec_i       = BitTorrent.Bencode.decode.Decode(code_i);
            var dec_str     = BitTorrent.Bencode.decode.Decode(code_str);
            var dec_ilist   = BitTorrent.Bencode.decode.Decode(code_ilist);
            var dec_idict   = BitTorrent.Bencode.decode.Decode(code_idict);
            var dec_list    = BitTorrent.Bencode.decode.Decode(code_list);
            var dec_dict    = BitTorrent.Bencode.decode.Decode(code_dict);

            // Проверяем успешность декодирования.
            #region
            if (dec_i == null)
            {
                Console.WriteLine("Deode i error!");
                Console.ReadKey();
                return;
            }
            if (dec_str == null)
            {
                Console.WriteLine("Decode str error!");
                Console.ReadKey();
                return;
            }
            if (dec_ilist == null)
            {
                Console.WriteLine("Decode ilist error!");
                Console.ReadKey();
                return;
            }
            if (dec_idict == null)
            {
                Console.WriteLine("Decode idict error!");
                Console.ReadKey();
                return;
            }
            if (dec_list == null)
            {
                Console.WriteLine("Decode list error!");
                Console.ReadKey();
                return;
            }
            if (dec_dict == null)
            {
                Console.WriteLine("Decode dict error!");
                Console.ReadKey();
                return;
            }
            Console.WriteLine("Decode success.\n");
            #endregion

            // Раскодируем буффер содержащий несколько закодированных объетов.
            var array = new List<object>();
            while (code_buffer.Length != 0)
            {
                var sub_obj = BitTorrent.Bencode.decode.SubObject(code_buffer);
                if (sub_obj != null)
                {
                    code_buffer = code_buffer.Remove(0, sub_obj.Length);
                    array.Add(BitTorrent.Bencode.decode.Decode(sub_obj));
                }
                else
                    break;
            }
            Console.WriteLine("Decode buffer success.");
            Console.WriteLine("Остаток в buffer: {0}\n", code_buffer);

            // Выведем результат раскодирования.
            Console.WriteLine("array type: {0}\n",array.ToString());
            foreach (var e in array)
                Console.WriteLine(e.GetType().ToString());

Last edited Aug 18, 2010 at 5:28 PM by Norgat, version 4

Comments

No comments yet.