Функция на C++ в php

Jeck

Новичок
Функция на C++ в php

Такой вопрос. Как переписать данную функцию на php
PHP:
unsigned long add_ckecksum(unsigned char *raw, int count) {
    long chksum = 0L;
    for( int i = 0; i < count; i += 4 ) chksum ^= *((unsigned long *)&raw[i]);
    
    printf("checksum: 0x%x\n",chksum);
    memcpy(raw+count, (char *)&chksum, 4);
    return chksum;
}
А точнее вот эту конструкцию chksum ^= *((unsigned long *)&raw) ?
 

Jeck

Новичок
По русски - вычисляет чек сумму для пакета... если быть ещё точнее то для протокола Lineage2. Рабочую функцию нашел только в таком виде. Надо переписать на php...
 

Koc9k

Новичок
Автор оригинала: Jeck
По русски - вычисляет чек сумму для пакета... если быть ещё точнее то для протокола Lineage2. Рабочую функцию нашел только в таком виде. Надо переписать на php...
Blowfish ключ?) П.с. По теме не знаю , сорри П.с.с сам в л2 рубал немало
 

Jeck

Новичок
Да с Blowfish то проблем нет... Проблема с этой контрольной суммой для логин пакета... Не программировал я на C++ совсем... К unpack то этот код каким боком то ? К pack уж тогда раз там приведение к типу Long есть...
 

Jeck

Новичок
>А что именно непонятно?
Что делает вот этот кусок кода C++
PHP:
chksum ^= *((unsigned long *)&raw[i]);
 

phprus

Moderator
Команда форума
Jeck

Вот это возвращает длинное беззнаковое целое, которое находится в памяти по адресу (raw + i) Тоесть 4 байта начиная с (raw + i) будут интерпретироваться как беззнаковое длинное целое и именно оно будет возвращено.

Чтобы переписать этот код нужно распаковать строку raw в массив long-ов при помощи unpack, а потом выполнить для его элементов и chksum операцию ^
 

Jeck

Новичок
phprus
Спасибо ! Пошел разбираться !

-~{}~ 28.05.07 00:00:

Ещё раз большое спасибо ! Все работает.
PHP:
function ckecksum($raw) {
	$chksum = 0;
	$raw = unpack("L*",$raw);
	for ($i=1;$i<=count($raw);$i++) {
		$chksum ^= $raw[$i];
	}
	return pack("L",$chksum);
}
 

AnToXa

prodigy-одаренный ребенок
1. на 64-битной платформе эту фукнцию ждет сюрприз. (когда long будет 8 байт)
2. эта функция потенциально читает за пределами переданой области, если ее размер не кратен long (хотя может быть у lineage это как раз так и есть).
 
Сверху