1. Гость, мы просим Вас ознакомиться с Правилами Форума и Отказом от ответственности!

1.4.4 попытка разобрать хекс игровой базы (список кланов)

Тема в разделе 'PW Вопросник', создана пользователем wsok, 15 фев 2015.

  1. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    пробую понять, как работать с хекс данными игровой базы на примере списка кланов...

    Имею две машины, на одной сборка 1.4.4 на второй 1.5.1, скрипт в котором пытаюсь разбирать данные один и тот же:

    PHP:
    <?
    function 
    cuint($data)
    {
        if(
    $data 64)
            return 
    strrev(pack("C"$data));
        else if(
    $data 16384)
            return 
    strrev(pack("S", ($data 0x8000)));
        else if(
    $data 536870912)
            return 
    strrev(pack("I", ($data 0xC0000000)));
        return 
    strrev(pack("c", -32) . pack("i"$data));
    }

    $bdname 'factioninfo';
    $bdlen pack("n*"strlen($bdname)+32768);
    $data pack('N', -1) . $bdlen $bdname "\x00\x00\x00\x00";

        
    $Socket socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
        
    $Data cuint(3055).cuint(strlen($data)).$data;

            if(
    socket_connect($Socket,"127.0.0.1","29400"))
        {
            
    socket_set_block($Socket);

            
    $send socket_send($Socket,$Data,8192,0);
            
    $recv socket_recv($Socket,$buf,8192,0);
            
    socket_set_nonblock($Socket);
            
    socket_close($Socket);
        }

        echo 
    "Версия сервера 1.5.1(101)<br><br>";
        
    $var "Запрос: ".bin2hex($Data)."<br>-<br>";
        
    $var2 "Ответ: ".bin2hex($buf)."<br>-<br>";
        echo 
    $var.$var2."<hr>";
        echo 
    "Попытка разобрать пакет с ответом: <hr>";
      
                    
    $strlarge unpack"H"substr$buf2) );
                if(
    substr($strlarge[1], 01) == "8")
                {
                    
    $start 13;
                }
                else
                {
                    
    $start 12;
                }

                    
    $clancount unpack"c"substr$buf$start) );
                
    $start $start+7//точка отсчета и пропускаем 7 байтов (пока не понял для чего они)
                            
    for($c=0$i<$clancount[1]; $i++)
                {
                    
    $clanid unpack"N*"substr$buf$start) );
                    
    $start $start+4;

                    
    $namelarge unpack"c*"substr$buf$start) );
                    
    $start $start+1;
      
                    
    $clanname iconv"UTF-16""UTF-8"substr$buf$start$namelarge[1] ) );
                    
    $start $start+$namelarge[1];
                  
                    
    $clan2 unpack"C*"substr$buf$start) );
                    
    $start $start+1;
                  
                    
    $clan3 unpack"N*"substr$buf$start) );
                    
    $start $start+11//точка отсчета и пропускаем 11 байтов (пока не понял для чего они)
                  

                    
    $namelarge2 unpack"c*"substr$buf$start) );
                    
    $start $start+1;
      
                    
    $news iconv"UTF-16""UTF-8"substr$buf$start$namelarge2[1] ) );
                    
    $start $start+$namelarge2[1];
                    
    $start $start+7//точка отсчета и пропускаем 7 байтов (пока не понял для чего они)
                  
                    
    $clan_list .="<font color='red'>[ {$clanid[1]} ]  {$clanname} {$clan2[1]} {$clan3[1]} {$news}</font><hr>";
                      
                }
              
    echo 
    $clan_list;
    ?>
    в общем, испытав его на 1.5.1, немного обрадовался, так как получил листинг кланов:

    [​IMG]

    но, разочаровался, когда запустил его на 1.4.4:

    [​IMG]

    Как видно, только первую запись скрипт декодировал нормально, остальные записи увы нет...

    И ещё для информации, на обоих серверах по 6 кланов, однако на 1.5.1 было 2 клана, я довел их количество до 6, после создания каждого клана проверял листинг в скрипте, он показывал корректно 3, 4, 5 и 6 кланов. До этого я полагал, что причина ошибки в 1.4.4 из за того, что там 6 кланов и дело в длине пакета, оказалось, что видимо это не так, ведь на 1.5.1 сейчас тоже 6 кланов и они отображаются в скрипте нормально.

    Так что я порядком уже запутался, в чем же дело?
  2. int 3 Программист Пользователи Open Source Contributor

    Сообщения:
    342
    Лайки:
    531
    Пол:
    Мужской
    Репутация:
    10
    Страна:
    Russian Federation Russian Federation
    Разные структуры пакетов
  3. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    Хочешь сказать, что в целом при обработке хекса с 1.5.1 у меня ошибок нет, просто в 1.4.4 придется немного изменить перемещение по байтам. Разная структура пакетов 144 и 151?
  4. int 3 Программист Пользователи Open Source Contributor

    Сообщения:
    342
    Лайки:
    531
    Пол:
    Мужской
    Репутация:
    10
    Страна:
    Russian Federation Russian Federation
    Я не смотрел код, так как не шарю в php, но по результату парсинга видно, что первый клан читается нормально, а остальные - нет. Это означает, что длина описания одного клана разная, поэтому начиная со второго клана идёт сдвиг, который и ломает всё. Можно наугад менять кол-во "пропускаемых ненужных байт", скорее всего получится
    Но это только мои предположения
  5. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    но странно, что в 151 без проблем парсится, хоть и ожидалось, что структура пакетов в 151 может быть более мудренная,чем в 144. Все же интересно увидеть конструктивный ответ, который поможет понять как же решить проблему?
  6. int 3 Программист Пользователи Open Source Contributor

    Сообщения:
    342
    Лайки:
    531
    Пол:
    Мужской
    Репутация:
    10
    Страна:
    Russian Federation Russian Federation
    А какая разница? Если бы описание одного клана в 1.5.1 было
    Код:
    int, int, int, char
    а в 1.4.4
    Код:
    int, int, int
    и char нигде не выводился бы, то, очевидно, всё бы сломалось
  7. vieraw Пользователи

    Сообщения:
    54
    Лайки:
    27
    Репутация:
    0
    Конструктивный ответ? Брось ты эту затею, не твое это.
    По теме. Структура не менялась, т.е. она идентична для всех версий.
    Не знаю что это? Ну и черт с ним пропущу. Посмотри структуру пакет FactionInfo и все вопросы должны пропасть.
    Я привел что из себя представляет пакет DBRawRead в прошлой теме, но ты как пропускал мифические цифры, которые меняться, так и пропускаешь.
    Последнее редактирование: 15 фев 2015
  8. JonMagon Программист Пользователи Open Source Contributor

    Сообщения:
    804
    Лайки:
    808
    Пол:
    Мужской
    Репутация:
    5
    Страна:
    Germany Germany
    Действительно, почему ты пропускаешь? На стороне сервера используется маршалинг, а не тупо запись байт, взятых с потолка, в поток.
    Там может лежать, что угодно. Нельзя так просто сидеть и гадать.
  9. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    предлагаешь не пропускать, а пытаться раскодировать байты, которые встречаются на пути цикла?
  10. JonMagon Программист Пользователи Open Source Contributor

    Сообщения:
    804
    Лайки:
    808
    Пол:
    Мужской
    Репутация:
    5
    Страна:
    Germany Germany
    Именно.
  11. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    решил сделать как ты сказал, получил любопытный результат, однако на 144 все так же ломанный парсинг:

    1.4.4 листинг:
    [​IMG]

    151 листинг:
    [​IMG]

    ну и сам скрипт парсинга:

    PHP:
    <?
    function 
    cuint($data)
    {
        if(
    $data 64)
            return 
    strrev(pack("C"$data));
        else if(
    $data 16384)
            return 
    strrev(pack("S", ($data 0x8000)));
        else if(
    $data 536870912)
            return 
    strrev(pack("I", ($data 0xC0000000)));
        return 
    strrev(pack("c", -32) . pack("i"$data));
    }

    $bdname 'factioninfo';
    $bdlen pack("n*"strlen($bdname)+32768);
    $data pack('N', -1) . $bdlen $bdname "\x00\x00\x00\x00";

        
    $Socket socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
        
    $Data cuint(3055).cuint(strlen($data)).$data;

            if(
    socket_connect($Socket,"127.0.0.1","29400"))
        {
            
    socket_set_block($Socket);

            
    $send socket_send($Socket,$Data,8192,0);
            
    $recv socket_recv($Socket,$buf,8192,0);
            
    socket_set_nonblock($Socket);
            
    socket_close($Socket);
        }

        echo 
    "Версия сервера 1.4.4(60)<br><br>";
        
    $var "Запрос: ".bin2hex($Data)."<br>-<br>";
        
    $var2 "Ответ: ".bin2hex($buf)."<br>-<br>";
        echo 
    $var.$var2."<hr>";
        echo 
    "Попытка разобрать пакет с ответом: <hr>";
      
                    
    $strlarge unpack"H"substr$buf2) );
                if(
    substr($strlarge[1], 01) == "8")
                {
                    
    $start 13;
                }
                else
                {
                    
    $start 12;
                }

                    
    $clancount unpack"c"substr$buf$start) );
                
    $start $start+7//точка отсчета и пропускаем 7 байтов (пока не понял для чего они)
                            
    for($c=0$i<$clancount[1]; $i++)
                {
                    
    $clanid unpack"N*"substr$buf$start) );
                    
    $start $start+4;

                    
    $namelarge unpack"c*"substr$buf$start) );
                    
    $start $start+1;
      
                    
    $clanname iconv"UTF-16""UTF-8"substr$buf$start$namelarge[1] ) );
                    
    $start $start+$namelarge[1];
                  
                    
    $clan2 unpack"C*"substr$buf$start) );
                    
    $start $start+1;
                  
                    
    $clan3 unpack"N*"substr$buf$start) );
                    
    $start $start+1;
                  
                    
    $clan4 unpack"N*"substr$buf$start) );
                    
    $start $start+1;
                  
                    
    $clan5 unpack"N*"substr$buf$start) );
                    
    $start $start+1;
                  
                    
    $clan6 unpack"N*"substr$buf$start) );
                    
    $start $start+1;
                  
                    
    $clan7 unpack"N*"substr$buf$start) );
                    
    $start $start+1;
                  
                    
    $clan8 unpack"N*"substr$buf$start) );
                    
    $start $start+1;
                  
                    
    $clan9 unpack"N*"substr$buf$start) );
                    
    $start $start+1;
                  
                    
    $clan10 unpack"N*"substr$buf$start) );
                    
    $start $start+1;
                  
                    
    $clan11 unpack"N*"substr$buf$start) );
                    
    $start $start+1;
                  
                    
    $clan12 unpack"N*"substr$buf$start) );
                    
    $start $start+1;
                  
                    
    $clan13 unpack"N*"substr$buf$start) );
                    
    $start $start+1;

                    
    $namelarge2 unpack"c*"substr$buf$start) );
                    
    $start $start+1;
      
                    
    $news iconv"UTF-16""UTF-8"substr$buf$start$namelarge2[1] ) );
                    
    $start $start+$namelarge2[1]+1;
                  
                    
    $clan14 unpack"N*"substr$buf$start) );
                    
    $start $start+1;
                  
                    
    $clan15 unpack"N*"substr$buf$start) );
                    
    $start $start+1;
                  
                    
    $clan16 unpack"N*"substr$buf$start) );
                    
    $start $start+1;
                  
                    
    $clan17 unpack"N*"substr$buf$start) );
                    
    $start $start+1;
                  
                    
    $clan18 unpack"N*"substr$buf$start) );
                    
    $start $start+1;
                  
                    
    $clan19 unpack"N*"substr$buf$start) );
                    
    $start $start+1;
                  
                  
                
    $clan_list .="<font color='red'>[ {$clanid[1]} ]  {$clanname} | {$clan2[1]} | {$clan3[1]} | {$clan4[1]} | {$clan5[1]} | {$clan6[1]} | {$clan7[1]} | {$clan8[1]} | {$clan9[1]} | {$clan10[1]} | {$clan11[1]} | {$clan12[1]} | {$clan13[1]} | {$news} | {$clan14[1]} | {$clan15[1]} | {$clan16[1]} | {$clan17[1]} | {$clan18[1]} | {$clan19[1]}</font><hr>";
                      
                }
              
    echo 
    $clan_list;
    ?>
    вроде почти каждый байт декодировал (кроме 7 байтов до цикла), но на 144 все равно ломается парсинг данных.
  12. JonMagon Программист Пользователи Open Source Contributor

    Сообщения:
    804
    Лайки:
    808
    Пол:
    Мужской
    Репутация:
    5
    Страна:
    Germany Germany
    Эм, vieraw же писал.
    Плюс ко всему, очень непонятно: ты читаешь 4 байта, а смещаешь на 1.
    Код:
    $clan13 = unpack( "N*", substr( $buf, $start, 4 ) );
    $start = $start+1;
    Joslian нравится это.
  13. Joslian AngeliCore Программист Пользователи Open Source Contributor

    Сообщения:
    1.051
    Лайки:
    537
    Пол:
    Мужской
    Репутация:
    2
    Как говорил alexdnepro, сначала нужно написать класс для удобной работы с пакетами, а потом уже разбирать пакеты или писать их по структуре.
  14. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    у алекса хорошее чувство юмора, что сделать класс такой, надо примерно понять мне как парсить данные. Иначе не представляю для себя эту возню с написанием класса.
    --- добавлено: 15 фев 2015 в 17:57 ---
    хочешь сказать, смещать не нужно вообще?
    Последнее редактирование модератором: 23 фев 2015
  15. JonMagon Программист Пользователи Open Source Contributor

    Сообщения:
    804
    Лайки:
    808
    Пол:
    Мужской
    Репутация:
    5
    Страна:
    Germany Germany
    Я хочу сказать, что если ты читаешь 4 байта, то и смещать надо на 4.
  16. vieraw Пользователи

    Сообщения:
    54
    Лайки:
    27
    Репутация:
    0
    После того как ты прочитал количество элементов в массиве:
    Хоть конечно нужно понять, что длина всегда cuint, ну ладно.
    Дальше идет сам массив (vector), который представляет из себя key - octets, value - octets.
    Эти 7 байт получаются из 1 байт (cuint) - количество кланов, 1 байт - длина key (cuint), 4 байта сам key и 1 байт - длина value (cuint).
    Сам value из себя представляет:
    PHP:

            
    'fid'=>'int',
            
    'name'=>'string',
            
    'level'=>'byte',
            
    'master'=>[
                
    'roleid'=>'int',
                
    'role'=>'byte'
            
    ],
            
    'member'=>[
                
    'roleid'=>'int',
                
    'role'=>'byte'
            
    ],
            
    'announce'=>'string',
            
    'sysinfo'=>'octets'
    member - vector, т.е. roleid и role читаются в цикле.
    Если не ошибаюсь, вроде так.
    P.S. Больше не могу на это смотреть.
    Последнее редактирование: 15 фев 2015
    JonMagon, Joslian и int 3 нравится это.
  17. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    Если бы я разбирался хорошо в парсинге хекс данных, то и темы бы этой не было. Собственно данный форум и создан для того, чтоб люди могли получать конструктивную помощь на свои вопросы и желательно с примерами для ускорения процесса обучения.

    К сожалению самые продвинутые в этом плане люди тут, теперь используют данный форум не совсем по прямому назначению, осуществлять поддержку тех, кто только начинает постигать такие вещи, для них форум теперь что то вроде торговой площадки своих разработок и поделиться фрагментом кода, класса и т.п. для них одно и тоже, как и позволить залезть к себе в карман... жаль конечно, что DEV форум становится торговой площадкой.

    Насчет структуры я примерно понял, но пока плохо представляю практический пример такого такого рода, писать класс, это опять же нужно 100% понимать методы парсинга хекс данных, увы я пока в данном направлении вообще плохо продвинулся, единственное, что пока могу пытаться разобрать хекс методом тыка, как я это и делаю сейчас, хоть и понимаю, что с точки зрения тех, кто лучше понимает в этом деле, это по меньшей мере мазохизм, но... если нет конструктивных ответов, то и приходится, если мало информации на этот счет - страдать мазохизмом...
  18. vieraw Пользователи

    Сообщения:
    54
    Лайки:
    27
    Репутация:
    0
    Вы издеваетесь? Это уже не первый пакет, на котором вы обучаетесь. Данный пакет вам был назван месяца три назад, если не больше. В соседней теме вам был показана его структура и опкод, сказано, что не стоит тупо пропускать байты. Вам была названа структура для чтения данных о кланах. И извините конечно, но это уже не первая подобная тема где вы не желаете искать информацию и у меня складывается впечатление, что вы просто ждете что вам дадут готовое.

    А какой смысл мне показывать вам свой код? Почему я должен давать его вам бесплатно? Напомню, что вам тут никто ничем не обязан.
    И уж извините, но в этих двух темах разжевано уже дальше некуда.
    Последнее редактирование: 15 фев 2015
  19. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    ну почему бы и не заплатить за конструктивный ответ? Главное чтоб он был.
  20. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    вот я пытаюсь тут разобрать пакет от factioninfo, ради того, чтоб получить список кланов включающий в себя айди мастеров, может можно это получить с пакета factionname, или там нет данных о мастерах? Вообще какая структура там?
Черновик сохранён Черновик удалён
Similar Threads
  1. chetoss
    Ответов:
    40
    Просмотров:
    13.088
  2. New-X
    Ответов:
    5
    Просмотров:
    1.672
  3. wsok
    Ответов:
    21
    Просмотров:
    2.684
  4. Dimka))))
    Ответов:
    14
    Просмотров:
    2.252
  5. Roymike
    Ответов:
    32
    Просмотров:
    4.536
Загрузка...

Поделиться этой страницей