Перевести CRC-алгоритм из C в переполнение стека

РЕШИТЬ

У меня есть следующий код на C, и я должен написать его на PHP

const U16 crc_table[16] = {
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
};

U16 CalculateCrc(char *data, U32 len) {
U32 i;
U16 crc = 0;

while (len--) {
i = (crc >> 12) ^ (*data >> 4);
crc = crc_table[i & 0x0F] ^ (crc << 4);
i = (crc >> 12) ^ (*data >> 0);
crc = crc_table[i & 0x0F] ^ (crc << 4);
data++;
}
return (crc & 0xFFFF);
}

В переводе базовой логики я сделал это до сих пор:

public function crc($data){

$i = 0;
$crc = 0;

/* @var $crc_table array */
$crc_table = array
(
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
);

for($a = 0; $a < strlen($data); $a++){
$i = (($crc >> 12) ^ ($data[$a] >> 4));
$crc = ($crc_table[$i & 0x0F] ^ ($crc << 4));
$i = (($crc >> 12) ^ $data[$a]);
$crc = ($crc_table[$i & 0x0F] ^ ($crc << 4));
}return ($crc & 0xFFFF);

}

Результаты не совпадают ни в коем случае, и я не эксперт в таких вещах. Любое предложение?


РЕДАКТИРОВАТЬ

Спасибо «брезгливому оссифражу»!
Исходя из вашей помощи, я сейчас использую эту функцию:

private function crc($data){

$i = 0;
$crc = 0;

$crc_table = array
(
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
);

$data = hex2bin($data);
$l = 0;
while($l < strlen($data)){

$byte = $data[$l];
$i = (($crc >> 12) ^ (ord($byte) >> 4));
$crc = ($crc_table[$i & 0x0F] ^ ($crc << 4));
$i = (($crc >> 12) ^ (ord($byte) >> 4));
$crc = ($crc_table[$i & 0x0F] ^ ($crc << 4));
$l++;
}

return ($crc & 0xFFFF);

}

Я тестирую его с «Hello world» в шестнадцатеричном формате «48656C6C6F20776F726C64».
На C я получаю 37278 и на php функцию выше 56062.

Есть какие-нибудь подсказки сейчас?


РЕДАКТИРОВАТЬ

Хорошо, мой плохой … проблема была уже решена, но я запутался после стольких испытаний.

Это моя первая версия кода с предложенным исправлением «брезгливым оссиффражем»:

$byte = $data[$l];
$i = (($crc >> 12) ^ (ord($byte) >> 4));
$crc = ($crc_table[$i & 0x0F] ^ ($crc << 4));
$i = (($crc >> 12) ^ **ord($byte));**
$crc = ($crc_table[$i & 0x0F] ^ ($crc << 4));
$l++;

Спасибо!

0

Решение

Ваш код не работает, потому что вы вычисляете продукты XOR целых чисел и строковых переменных:

$i = (($crc >> 12) ^ ($data[$a] >> 4));

Вот $data[$a] является подстрокой входных данных. Вы должны использовать ord() чтобы преобразовать это в целое число:

$i = (($crc >> 12) ^ (ord($data[$a]) >> 4));

(Редактировать: С этим изменением вашего кода PHP, строка Hello, world! хеширует до 31454 в обеих функциях.)

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]