Имеем структуру пакета 代码: 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; }
Длина октета не один байт, а куинт. Возможно, это и происходит из-за неправильного смещения. Попробуй затолкать вещи с более короткими октетами (< 80 байт).
Ну понятно, читай тогда длину октета не байтом, а куинтм. Полный алгоритм описывать не буду — длина октета пух обычно не такая огромная, и хватит первого. Читаешь первый байт и смотришь. Если он больше или равен 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
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) ""
Ты уверен, что он ругается именно на эту строчку? Я не спец в php, но эта конструкция Nid/Npos/Ncount/Nmax_count мне мозг выносит. Что она означает или должна означать? В спеке php по pack первым аргументом является обычный тип, без подобных конструкций.
http://s011.radikal.ru/i317/1409/17/249c26dfe8e2.png --- добавлено: 15 сен 2014 в 20:17 --- Данная конструкция у меня везде работает, кроме этого момента