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

1.5.1 (101) (PHP-Socket)Обработка пакета GRoleData

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

  1. TopicStarter Overlay

    DIABLO Old school Пользователи

    Сообщения:
    74
    Лайки:
    7
    Пол:
    Мужской
    Репутация:
    1
    Команда:
    Aquilon PW
    Имеем структуру пакета
    Код:
    struct GRoleData {
        GRoleBase base;
        GRoleStatus status;
        GRolePocket pocket;
        GRoleEquipment equipment;
        GRoleStorehouse storehouse;
        GRoleTask task;
    }
    Все выводит нормально пока не дошел до "GRoleEquipment", где она ссылается на GRoleInventory
    Код:
    struct GRoleInventory  {
        unsigned int id;
        int pos;
        int count;
        int max_count;
        Octets data;
        int proctype;
        int expire_date;
        int guid1;
        int guid2;
        int mask;
    }
    Код:
    ecount:20 (Кол-во одетых вещей)
    array(4) { ["id"]=> int(33511) ["pos"]=> int(1) ["count"]=> int(1) ["max_count"]=> int(1) }
    ===============================================================
    array(4) { ["id"]=> int(15004) ["pos"]=> int(2) ["count"]=> int(1) ["max_count"]=> int(1) }
    ===============================================================
    array(4) { ["id"]=> int(50283) ["pos"]=> int(3) ["count"]=> int(1) ["max_count"]=> int(1) }
    ===============================================================
    array(4) { ["id"]=> int(33505) ["pos"]=> int(4) ["count"]=> int(1) ["max_count"]=> int(1) }
    ===============================================================
    array(4) { ["id"]=> int(15016) ["pos"]=> int(5) ["count"]=> int(1) ["max_count"]=> int(1) }
    ===============================================================
    array(4) { ["id"]=> int(33502) ["pos"]=> int(6) ["count"]=> int(1) ["max_count"]=> int(1) }
    ===============================================================
    array(4) { ["id"]=> int(33508) ["pos"]=> int(7) ["count"]=> int(1) ["max_count"]=> int(1) }
    ===============================================================
    Warning: unpack(): Type N: not enough input, need 4, have 0 in /var/www/dev/role.php on line 403 bool(false)
    Warning: unpack(): Type N: not enough input, need 4, have 0 in /var/www/dev/role.php on line 410 Fatal error: Unsupported operand types in /var/www/dev/role.php on line 410 

    PHP:
       
    echo 'ecount:'.$equipment['ecount'].'</br>';
      
            for(
    $i=0;$i<$equipment['ecount'];$i++)
            {
                
    $equipment['itemeqp'.$i] = unpack("Nid/Npos/Ncount/Nmax_count",substr($status,$p));
                echo 
    var_dump($equipment['itemeqp'.$i]);echo '</br>';
                
    $p += 16;
                
    $equipment['itemeqp'.$i]['data'] = upoctet($status$p);
                
    #echo 'Oktet: '.$equipment['itemeqp'.$i]['data'].'</br>';
                
    $equipment['itemeqp'.$i] += unpack("Nproctype/Nexpire_data/Nguid1/Nguid2/Nmask",substr($status,$p));
              
                echo 
    '===============================================================</br>';
                
    $p += 20;
            }   
  2. JonMagon Программист Пользователи Open Source Contributor

    Сообщения:
    805
    Лайки:
    809
    Пол:
    Мужской
    Репутация:
    5
    Страна:
    Germany Germany
    Длина октета не один байт, а куинт. Возможно, это и происходит из-за неправильного смещения. Попробуй затолкать вещи с более короткими октетами (< 80 байт).
  3. TopicStarter Overlay

    DIABLO Old school Пользователи

    Сообщения:
    74
    Лайки:
    7
    Пол:
    Мужской
    Репутация:
    1
    Команда:
    Aquilon PW
    в том то и дело с короткими октетами выводит норм информацию
  4. JonMagon Программист Пользователи Open Source Contributor

    Сообщения:
    805
    Лайки:
    809
    Пол:
    Мужской
    Репутация:
    5
    Страна:
    Germany Germany
    Ну понятно, читай тогда длину октета не байтом, а куинтм. Полный алгоритм описывать не буду — длина октета пух обычно не такая огромная, и хватит первого.

    Читаешь первый байт и смотришь. Если он больше или равен 80h, то читаешь как одно машинное слово в LE.

    На C# это будет выглядеть примерно так
    Код:
                switch (buf[0] & 0xE0)
                {
                    case 0x80:
                        return (uint)(BitConverter.ToUInt16(new byte[] { buf[1], buf[0] }, 0) & 0x3FFF);
                }
                return (uint)code;
    Под php это будет что-то на основе pack/unpack
  5. TopicStarter Overlay

    DIABLO Old school Пользователи

    Сообщения:
    74
    Лайки:
    7
    Пол:
    Мужской
    Репутация:
    1
    Команда:
    Aquilon PW
    PHP:
        echo 'ecount:'.$equipment['ecount'].'</br>';
      
            for(
    $i=0;$i<$equipment['ecount'];$i++)
            {
                
    $equipment['itemeqp'.$i] = unpack("Nid/Npos/Ncount/Nmax_count",substr($status,$p));
                
    $p += 16;
                
    $equipment['itemeqp'.$i]['data'] = upoctet($status$p);
                echo 
    var_dump$equipment['itemeqp'.$i]['data']);echo '</br>';
                
    $equipment['itemeqp'.$i] += unpack("Nproctype/Nexpire_data/Nguid1/Nguid2/Nmask",substr($status,$p));
                echo 
    '===============================================================</br>';
                
    $p += 20;

            }
    Код:
    ecount:16
    string(192) "6500ff039800000000000000d0840000d0840000240001000000000000000000000000001501000000000000000000000000000000000000000000000300000000000000000000000000000002000000e028000006000000e128000008000000"
    ===============================================================
    string(184) "6300ff030000000000000000df5c0000b45f0000240001001f000000000000002001000000000000000000000000000000000000000000000000000000000000030000006b210000020000006421000001000000f32300001f000000"
    ===============================================================
    string(248) "6500ff030000000000000000d08400007094000024000100000000004a0100000000000000000000fa000000fa000000fa000000fa000000fa00000002000000000000000000000006000000ce2500000d000000e02800000900000032210000fa000000c22a000001000000b4270000cdcccc3dfe28000004000000"
    ===============================================================
    string(208) "6500ff03fc00000036000000c8af0000c8af00002400010029060000000000000000000000000000a4020000a4020000a4020000a4020000a40200000300000000000000000000000000000003000000e028000006000000e8270000010000002b2b00000a000000"
    ===============================================================
    string(184) "6300ff0300000000000000002a5d0000b45f000024000100000000000000000020010000000000000000000000000000000000000000000000000000000000000300000064210000010000009725000008000000a425000005000000"
    ===============================================================
    string(216) "6500ff03fc00000036000000709400007094000024000100630500000000000000000000000000004f0200004f0200004f0200004f0200004f020000040000000000000000000000000000000000000003000000e128000008000000e028000008000000292b000008000000"
    ===============================================================
    string(64) "c20100008403000032000400180000000c000000000020400000904001000000"
    ===============================================================
    string(0) ""
    ===============================================================
    string(16) "edf401000000003f"
    ===============================================================
    Warning: unpack(): Type N: not enough input, need 4, have 2 in /var/www/dev/role.php on line 403 string(0) ""
    Warning: unpack(): Type N: not enough input, need 4, have 0 in /var/www/dev/role.php on line 411 Fatal error: Unsupported operand types in /var/www/dev/role.php on line 411 
    --- добавлено: 15 сен 2014 в 20:03 ---
    Проблема в том что он еще ругается на строчку
    PHP:
     $equipment['itemeqp'.$i] = unpack("Nid/Npos/Ncount/Nmax_count",substr($status,$p));
    Код:
    Warning: unpack(): Type N: not enough input, need 4, have 2 in /var/www/dev/role.php on line 403 string(0) ""
    Последнее редактирование модератором: 23 сен 2014
  6. JonMagon Программист Пользователи Open Source Contributor

    Сообщения:
    805
    Лайки:
    809
    Пол:
    Мужской
    Репутация:
    5
    Страна:
    Germany Germany
    Покажи echo substr($status,$p);
  7. TopicStarter Overlay

    DIABLO Old school Пользователи

    Сообщения:
    74
    Лайки:
    7
    Пол:
    Мужской
    Репутация:
    1
    Команда:
    Aquilon PW
  8. JonMagon Программист Пользователи Open Source Contributor

    Сообщения:
    805
    Лайки:
    809
    Пол:
    Мужской
    Репутация:
    5
    Страна:
    Germany Germany
    Ты уверен, что он ругается именно на эту строчку?
    Я не спец в php, но эта конструкция Nid/Npos/Ncount/Nmax_count мне мозг выносит. Что она означает или должна означать? В спеке php по pack первым аргументом является обычный тип, без подобных конструкций.
  9. TopicStarter Overlay

    DIABLO Old school Пользователи

    Сообщения:
    74
    Лайки:
    7
    Пол:
    Мужской
    Репутация:
    1
    Команда:
    Aquilon PW
    http://s011.radikal.ru/i317/1409/17/249c26dfe8e2.png
    [​IMG]
    --- добавлено: 15 сен 2014 в 20:17 ---
    Данная конструкция у меня везде работает, кроме этого момента :D
    Последнее редактирование модератором: 23 сен 2014
  10. JonMagon Программист Пользователи Open Source Contributor

    Сообщения:
    805
    Лайки:
    809
    Пол:
    Мужской
    Репутация:
    5
    Страна:
    Germany Germany
    Да фиг его знает; возможно, не хватает длины того, что ты обрезаешь.
  11. TopicStarter Overlay

    DIABLO Old school Пользователи

    Сообщения:
    74
    Лайки:
    7
    Пол:
    Мужской
    Репутация:
    1
    Команда:
    Aquilon PW
    Есть у кого еще какие идеи?
Черновик сохранён Черновик удалён
Similar Threads
  1. Garena
    Ответов:
    1
    Просмотров:
    1.179
Загрузка...

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