Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 05.10.2007, 18:13   #1
Пользователь
 
Регистрация: 08.08.2007
Адрес: гандурас
Сообщений: 20
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
stirena
По умолчанию Как вычислить чексумму на дельфи?

Народ подскажите как вычислить чек сумму на дельфи, или помагите перевести функцию с с++

Код:
    void add_ckecksum(unsigned char *raw, int count)     {                                                
        unsigned long chksum = 0;
        unsigned long ecx;
        int i = 0;
        for(i = 0; i < count; i += 4)
        {
            ecx  = (unsigned long)raw[i];
            ecx |= (unsigned long)raw[i + 1]<<8;
            ecx |= (unsigned long)raw[i + 2]<<16;
            ecx |= (unsigned long)raw[i + 3]<<24;
            chksum ^= ecx;
        }
        memcpy(raw+count, (char *)&chksum, 4);
    }
у меня вот как криво получилось


Код:
       for i := 0 to ((Size-8) div 4)-1 do  begin
            ecx[0]  := data1[i] xor data1[i+4] ;
            ecx[1]  := data1[i+1] xor data1[i+5] ;
            ecx[2]  := data1[i+2] xor data1[i+6] ;
            ecx[3]  := data1[i+3] xor data1[i+7] ;
        end;
stirena вне форума   Ответить с цитированием
Старый 06.10.2007, 00:34   #2
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

прошу:
Код:
procedure AddChecksum(var data:array of char; position: Word);
var
  i:Word;
begin
  for i := 0 to (position div 4)-1 do
    PCardinal(@data[position])^:=PCardinal(@data[position])^ xor PCardinal(@data[i*4])^;
end;
используем так:
Код:
pck:=HexToString('26 00 02 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00');
AddChecksum(pck[3],Length(pck)-8-2);
тут pck это полный пакет от клиента логин серваре дешифрованный отправляемый в качестве запроса на вход на игровой сервер а Length(pck)-8-2 это позиция чексуммы относительно ID пакета (тоесть pck[3])
в результате примера в pck будет - 26 00 02 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 02 01 00 00 00 00 00 00

Добавлено спустя 5 часов 50 минут 33 секунды:
кстати то что ты представила как С++ код скорее всего не с++ а ява так как на яве нельзя манипулировать с памятью как хочется, а на С++ и этот код был бы намного короче)
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 02:58.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!