Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Из с++ в delphi что делает эта строка, key[0] = lock[0] xor lock[len-1] x 
:(
    Опции темы
RinOSpro
Дата 1.11.2007, 21:33 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Здравствуйте. В общем разбираю протокол Direct Connect и остановился вот на этой строчке
key[0] = lock[0] xor lock[len-1] xor lock[len-2] xor 5 непонимаю что делает эта строка и вот эта

Код

for (i = 0; i < len; i++)
    key[i] = ((key[i]<<4) & 240) | ((key[i]>>4) & 15)


кто знает с++ и delphi помогите. как это сделать в delphi?

Вот эту часть на си

Код

for (i = 1; i < len; i++)
    key[i] = lock[i] xor lock[i-1];


Код

for i := 1 to length(Lock) do
  begin
    chartmp := chr(ord(Lock[i]) xor ord(Lock[i-1]));
    keyLoc := keyLoc+chartmp;
  end;

я сделал вот так на delphi правильно ли?


Вот кусочек протокола 

Код

As part of the initial negotiation between the client and hub, the hub sends a $Lock <lock> Pk=<pk> command and the client must respond with a $Key <key> command. Until the DCN encoding, which we'll discuss last, the <key> has exactly as many characters as the <lock>. 

Except for the first, each key character is computed from the corresponding lock character and the one before it. If the first character has index 0 and the lock has a length of len then:

for (i = 1; i < len; i++)
    key[i] = lock[i] xor lock[i-1];

The first key character is calculated from the first lock character and the last two lock characters:

key[0] = lock[0] xor lock[len-1] xor lock[len-2] xor 5

Next, every character in the key must be nibble-swapped:

for (i = 0; i < len; i++)
    key[i] = ((key[i]<<4) & 240) | ((key[i]>>4) & 15)

Finally, the characters with the decimal ASCII values of 0, 5, 36, 96, 124, and 126 cannot be sent to the server. Each character with this value must be substituted with the string /%DCN000%/, /%DCN005%/, /%DCN036%/, /%DCN096%/, /%DCN124%/, or /%DCN126%/, respectively. The resulting string is the key to be sent to the server.

If your programming language of choice doesn't have xor or shift operations on characters, convert them to integers. If it doesn't have a bit shift at all, then x << y = x*(2**y) and x >> y = x/(2**y) for all integers x and y (** is the exponent operation or "to the power of"). Be sure to use unsigned values everywhere and do not do sign extension. Shift operations always lose the high or low bit (they are not roll operations!). The & (and) and | (or) operations are all logical, not boolean (eg. 6 & 13 = 4, not 1).

When the hub connects to the hublist, it must undergo a similar Lock/Key negotiation. The <key> calculation is the same, but the special number 5 in the second step is replaced with the following value is not computed from the hub's listening port, but rather the random outgoing port that the winsock selects. localport:

((localport>>8) + (localport & 255)) & 255 

  Вверх
bems
Дата 1.11.2007, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(RinOSpro @  1.11.2007,  21:33 Найти цитируемый пост)
key[i]<<4
key[i] shl 4

Цитата(RinOSpro @  1.11.2007,  21:33 Найти цитируемый пост)
key[i]>>4
key[i] shr 4

Цитата(RinOSpro @  1.11.2007,  21:33 Найти цитируемый пост)
Вот эту часть на си


код C++
1:
2:

for (i = 1; i < len; i++)
    key[i] = lock[i] xor lock[i-1];







код Pascal/Delphi
1:
2:
3:
4:
5:

for i := 1 to length(Lock) do
  begin
    chartmp := chr(ord(Lock[i]) xor ord(Lock[i-1]));
    keyLoc := keyLoc+chartmp;
  end;





я сделал вот так на delphi правильно ли?
имхо нужно length(Lock)-1

Добавлено через 2 минуты и 29 секунд
Цитата(RinOSpro @  1.11.2007,  21:33 Найти цитируемый пост)
key[0] = lock[0] xor lock[len-1] xor lock[len-2] xor 5 непонимаю что делает эта строка
а что тут непонятного?

Добавлено через 5 минут и 36 секунд
Цитата(RinOSpro @  1.11.2007,  21:33 Найти цитируемый пост)
The first key character is calculated from the first lock character and the last two lock characters:

key[0] = lock[0] xor lock[len-1] xor lock[len-2] xor 5
первый  key-символ вычисляется из первого lock-символа и последних двух lock-символов.

Первый и последние два элемента массива lock ксорятся между собой и с пятеркой



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Alix
Дата 1.11.2007, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 8
Всего: 23



Цитата(bems @  1.11.2007,  22:40 Найти цитируемый пост)
key[i] shr 4

тут нужно быть аккуратным. Если key[i] - знаковое, то дельфи делает арифметический сдвиг, иначе - логический

--
впрочем, у вас там скорее всего char'ы, и вряд ли в shortint конвертиться будут  smile 

Это сообщение отредактировал(а) Alix - 1.11.2007, 22:11


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
bems
Дата 1.11.2007, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Код

//for (i = 1; i < len; i++)
//    key[i] = lock[i] xor lock[i-1];
for i:=1 to length(lock)-1 do
 byte(key[i]):=byte(lock[i]) xor byte(lock[i-1]);

//key[0] = lock[0] xor lock[len-1] xor lock[len-2] xor 5
byte(key[0]):=byte(lock[0]) xor byte(lock[length(lock)-1]) xor byte(lock[length(lock)-2]) xor 5;

//for (i = 0; i < len; i++)
//    key[i] = ((key[i]<<4) & 240) | ((key[i]>>4) & 15)
for i:=0 to length(key)-1 do
 byte(key[i]):=((byte(key[i]) shl 4) and $F0) or ((byte(key[i]) shr 4) and $0F);



--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0460 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.