Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Всё о Direct Connect _ как сгенерировать овтетный ключ

Автор: Markiz 18.1.2010, 23:32

Где же собственно распространяется открыто алгоритм генерации $key - ответа на $lock? Искал, искал, не нашел.

Если есть выбор мне на C#. Но могу перевести с любого другого языка\описания big_smile.gif

Автор: Setuper 19.1.2010, 1:31

http://mydc.ru/index.html?showtopic=915&view=findpost&p=19477

Автор: Markiz 20.1.2010, 20:50

Спасибо за ответ big_smile.gif Наваял на C# вставьте в фак, может кому пригодится. И было бы совсем хорошо если бы в описании протокола в постах про $lock и $key была ссылка на пост с функциями.

Еще раз спасибо за помощь big_smile.gif

Код
    private string lock2key(string str_lock)
        {
            byte[] arr_key = new byte[str_lock.Length];
            int i;
            for (i = 1; i < str_lock.Length; ++i)
                arr_key[i] = (byte)(str_lock[i] ^ str_lock[i - 1]);
            arr_key[0] = (byte)(str_lock[0] ^ str_lock[str_lock.Length - 1] ^ str_lock[str_lock.Length - 2] ^ 5);

            return Encoding.ASCII.GetString(arr_key);
        }

Автор: Setuper 20.1.2010, 20:55

А где описание функции Encoding.ASCII.GetString ?

Автор: Markiz 20.1.2010, 21:51

Там же где и всегда, в MSDN big_smile.gif

http://mydc.ru/r/?http://msdn.microsoft.com/ru-ru/library/system.text.asciiencoding.getstring.aspx

Внес коррективы. не надо делать byte[] arr_key = new byte[str_lock.Length+1];

Это приводит к тому что последний символ получается пустой. Исправил. Кстати эта ошибка из сишной функции переехала, я с ней сверял результат. Думал так и положено что в конце ноль.

Автор: Setuper 20.1.2010, 23:11

В языке си переменная типа char* всегда оканчивается символом \0.

Что касается написанной функции, то я не уверен в том, что она всегда будет работать правильно, так как в ней отсутствует функция DCN экранирования. Собственно поэтому я и просил привести описание функции Encoding.ASCII.GetString, надеясь что в описании этой функции есть DCN экранирование.

Автор: mariner 21.1.2010, 1:41

Цитата(Setuper @ 20.1.2010, 23:11) *
В языке си переменная типа char* всегда оканчивается символом \0.


Не всегда. Все зависит от того, как задирать строку. Возможны и не нультерминированные строки. Кстати, string.h с ними вполне справляется

Автор: Setuper 21.1.2010, 1:57

Что значит не всегда? И что значит задирать строку?
Прочитай что я написал. Я говорю про конкретный тип char*.
Библиотека string содержит не столько тип, как целый класс для работы со строками и естественно в строке типа string отсутствует на конце символ \0. Причина этому то, что в строках string есть функция для возвращения длины строки, что нельзя сказать о типе char*, где символ \0 на конце и указывает нам где заканчивается строка, и всё что следует за этим символом является мусором, который может остаться от предыдущих строк в данном буфере.

Поэтому прекращай оффтопить big_smile.gif

Автор: mariner 21.1.2010, 2:03

>И что значит забирать строку?

Selffix

>char*

мне тебе пример накатать? =) Не уж то и поспорить нельзя, если ты делаешь спорные утверждения?

Автор: Markiz 21.1.2010, 13:03

В C# строки не требуют нультерминирования. Это же не последовательность байт, как в Си или Делфи, а объект, который сам о себе позаботится. Посему он символ \0 считает частью строки и вместе со всеми отправляет серверу, что не гуд, т.к. сервер этот символ не переваривает и обижается. Поэтому для С# +1 в размере создаваемого массива ставить нельзя.

По поводу DCN экранирования, это что? Выборка яндекса мне ничего не дала.

Автор: Setuper 21.1.2010, 13:15

По NMDC протоколу символы с кодами 0, 5, 36, 96, 124 и 126 должны быть заменены, соответственно, на /%DCN000%/, /%DCN005%/, /%DCN036%/, /%DCN096%/, /%DCN124%/ и /%DCN126%/.