Помогите подумать над HEX

webmaster_Chris

Новичок
Что имеем... Формула расчета CRC (18 байт)

PHP:
function crc($bytes)
{
 $r = 0x3B;
// исходя вот из этого void CRC (byte) {GPRS_CRC+=0x56^byte; GPRS_CRC++; GPRS_CRC^=0xC5+byte; GPRS_CRC--;}
 for($i = 0; $i < strlen($bytes); $i++)
 {
    print $i." - ".$bytes[$i]."\n";
        $r += 0x56 ^ ord($bytes[$i]);
        $r++;
        $r ^= 0xC5 + ord($bytes[$i]);
        $r--;
 }

 return $r & 0xFF;
}
и имеем строку 410356896034060161456900000000000000 у которой crc 41, или 410356895038776798456800000000000000 у которой сrc 07....

Если строку передаем так:

PHP:
printf('%02x', crc("410356896034060161456900000000000000"));
или вот так:

PHP:
$query = "41035689603406016145690000000000000041";

$query = "\x".$hex[0]."\x".$hex[1]."\x".$hex[2]."\x".$hex[3]."\x".$hex[4]."\x".$hex[5]."\x".$hex[6]."\x".$hex[7]."\x".$hex[8]."\x".$hex[9]."\x".$hex[10]."\x".$hex[11]."\x".$hex[12]."\x".$hex[13]."\x".$hex[14]."\x".$hex[15]."\x".$hex[16]."\x".$hex[17];
то получается неверное значение, но если передать:

PHP:
printf('%02x', crc("\x41\x03\x56\x89\x60\x34\x06\x01\x61\x45\x69\x00\x00\x00\x00\x00\x00\x00"));
то все хорошо... Где я программно не верно дописываю эти \x, или как правильнео расчитать без них?... Может функция строковая тогда должна использоваться не ord?
 

zerkms

TDD infected
Команда форума
Очевидно же, что
\x4\x1 (из первого варианта)
и
\x41 (из второго) - это разные строки.
 

webmaster_Chris

Новичок
Все равно не получается.. сделал вот так

PHP:
function crc($bytes)
{
 $r = 0x3B;

 for($i = 0; $i < strlen($bytes); $i++)
 {
        $byte = "\x".$bytes[$i];
    print $i." - ".$byte."\n";

        //$r += 0x56 ^ ord($bytes[$i]);
        $r += 0x56 ^ ord($byte);
        $r++;
        //$r ^= 0xC5 + ord($bytes[$i]);
        $r ^= 0xC5 + ord($byte);
        $r--;
 }

 return $r & 0xFF;
}
Ответ e3, а не 41.. ((( Где то все равно косяк... как же строку то туда скормить нормально...
 

zerkms

TDD infected
Команда форума
Для начала - научиться безошибочно генерировать искомую строку.

Для приобретения навыка - перечитать как необходимо производить отладку: phpfaq.ru/debug
 

webmaster_Chris

Новичок
Да строка вот: 410356896034060161456900000000000000
Понятно, что её надо сгенерить, а как считать уже понятно... Вопрос и был - как её сгенерить...
 

webmaster_Chris

Новичок
Приветствую Вурдалак! Подскажи тупому как, а то уже не crc пакета рассчитываю, а данные в нем на вменяемость... Как с помощью pack реализовать не совсем понимаю...
 

webmaster_Chris

Новичок
Я понимаю как использовать функцию.. я не знаю каким форматом паковать... ((
 

webmaster_Chris

Новичок
Я. Намек понял, какой из них:

h Hex string, low nibble first
H Hex string, high nibble first
s signed short (always 16 bit, machine byte order)
S unsigned short (always 16 bit, machine byte order)
n unsigned short (always 16 bit, big endian byte order)
v unsigned short (always 16 bit, little endian byte order)
i signed integer (machine dependent size and byte order)
I unsigned integer (machine dependent size and byte order)
l signed long (always 32 bit, machine byte order)
L unsigned long (always 32 bit, machine byte order)
N unsigned long (always 32 bit, big endian byte order)
V unsigned long (always 32 bit, little endian byte order)

А главное строку пихать или байт?
 

webmaster_Chris

Новичок
h Hex string, low nibble first
H Hex string, high nibble first

Продолжаем ))) Пакуем всю строку или по байту? :)
 

webmaster_Chris

Новичок
Американский форум: Ты задаешь вопрос, и тебе на него отвечают.
Еврейский форум: Ты задаешь вопрос, и тебе отвечают вопросом.
Русский форум: Ты задаешь вопрос, и тебе долго и со вкусом объясняют, какой же ты мудак.

А просто сказать по-человечески никак? Помощи же прошу...
 

Вурдалак

Продвинутый новичок
Да я уже всё ответил, просто это уже доходит до абсурда. Работаешь с какими-то байтами, битами, hex-строками, а постоянно в них путаешься и, по-моему, вообще не понимаешь что происходит.

Вот так оно выглядеть должно:
PHP:
$bytes = pack('H*', '410356896034060161456900000000000000');
Только я не уверен, что это тебе как-то поможет.
 
Сверху