Помогите подумать над 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?
 
Очевидно же, что
\x4\x1 (из первого варианта)
и
\x41 (из второго) - это разные строки.
 
Все равно не получается.. сделал вот так

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.. ((( Где то все равно косяк... как же строку то туда скормить нормально...
 
Для начала - научиться безошибочно генерировать искомую строку.

Для приобретения навыка - перечитать как необходимо производить отладку: phpfaq.ru/debug
 
Да строка вот: 410356896034060161456900000000000000
Понятно, что её надо сгенерить, а как считать уже понятно... Вопрос и был - как её сгенерить...
 
Приветствую Вурдалак! Подскажи тупому как, а то уже не crc пакета рассчитываю, а данные в нем на вменяемость... Как с помощью pack реализовать не совсем понимаю...
 
Я. Намек понял, какой из них:

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)

А главное строку пихать или байт?
 
h Hex string, low nibble first
H Hex string, high nibble first

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

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

Вот так оно выглядеть должно:
PHP:
$bytes = pack('H*', '410356896034060161456900000000000000');

Только я не уверен, что это тебе как-то поможет.
 
Сверху