Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C++ Builder > Расшифровать ответ сервера |
Автор: leporel 26.2.2010, 19:54 | ||||
Посылаю запрос
Ответ получается в ReceiveBuff Как вывести его по http://developer.valvesoftware.com/wiki/Server_Queries#Reply_format_3? Я не знаю как в Memo добавлять в одну и туже строку символы, но все равно делаю вот так
И в Memo только данные типа "String" показывает. |
Автор: XPyCT 27.2.2010, 00:44 | ||
ну предположим, подготовить для мемо можно попытаться так
Технику применения думаю разрулите |
Автор: mrbrooks 27.2.2010, 08:48 |
что бы разложить буфер по частям - необходимо представлять, что отвечает сервер. То бишь знать протокол обмена. |
Автор: leporel 27.2.2010, 11:25 |
mrbrooks, http://developer.valvesoftware.com/wiki/Server_Queries#Reply_format_3 |
Автор: mrbrooks 27.2.2010, 11:48 | ||
leporel, ок. Ответ ты получаешь в виде String. Теперь, как я понимаю, ты хочешь разложить строку по байтам? Если так то тебе необходимо либо ее перевести в буфер char методом c_str() строки, либо циклом по строке начиная с индекса 1, а не 0. т.е.
Так ты разложишь буфер по символам. |
Автор: leporel 27.2.2010, 12:11 | ||||
Так он цифры выводит, а если поставить Memo1->Lines->Add((char)ReceiveBuff[i]); буквы выводит. Попытался что-то сделать с тем что хруст предложил
Выводит теже самые символы но в одну строчку хоть. НО! символами показаны только переменные стринг (тоесть Server Name, Map, Game Directory и т.д) все остальные данные "byte" и "short" или не отображаются, или иероглифы. byte он только в самом начале отображает большую букву I (Type byte Should be equal to 'I' (0x49)) ЗЫ: Посмотрел что он цифрами выводит, и получается переменные типа byte он правильно показывает. И как понять где стринг выводить, а где цифру? |
Автор: mrbrooks 27.2.2010, 12:41 |
вот для этого и нужно знать протокол обмена. какой то кусок буфера - слово, какой то - цифра. vikaz сто раз прав. надо создать свою структуру - которая описывает принимаемый буфер в соответствие с протоколом обмена. |
Автор: leporel 27.2.2010, 12:46 | ||||||
как?
этим мои знания заканчиваются PS
Можно пример? |
Автор: mrbrooks 27.2.2010, 13:52 | ||
да вот же она
все прекрасно расписано. описываешь ее, затем копируешь в нее полученный буфер тем же memcpy. |
Автор: leporel 27.2.2010, 14:56 |
Извините меня, но ![]() memcpy - как я понял, копирует из чего то в другое, с указанным количество байтов, я не знаю как это реализовать... |
Автор: leporel 2.3.2010, 22:42 | ||
Делаю вот так. Проблема с отображением русских символов в названии и например вместо ★ получается â Как исправить? И ещё, вот например у этих http://www.gametracker.com/search/hl2zp/ серверов AppID должен быть 17505 или 17500, а показывает 92 нужном элементе массива, а в следующем элементе массива вместо 0 становиться 68 |
Автор: mrbrooks 3.3.2010, 08:45 | ||||
leporel, UnicodeString использовать вместо массива символов не кошерно. Можно конечно задать строго размер строки, но лучше всеже классический массив символов.
17500 == x445C 92 == 5C Режется старший байт.
откуда там кириллица? |
Автор: leporel 3.3.2010, 20:31 | ||
как исправить? |
Автор: leporel 8.5.2011, 00:44 | ||
Может кто объяснить что происходит при
|
Автор: borisbn 8.5.2011, 01:53 | ||||||
не знаю как описан ReceiveBuff, но предположим так
тогда в этом коде
делается следующее: ReceiveBuff[ i2+1 ] // от начала массива ReceiveBuff отступается i2+1 char'ов &ReceiveBuff[ i2+1 ] // берётся адрес этого (i2+1)-го элемента (short*)&ReceiveBuff[i2+1] // этот адрес теперь считается не указателем на char, а указателем на short *(short*)&ReceiveBuff[i2+1] // по этому, вновь созданному указателю, берётся один short (2 байта) server.appid = *(short*)&ReceiveBuff[i2+1] // этот short записывается в переменную server.appid
![]() leporel, а вообще-то прикольно задавать вопрос через год после того, как обсуждение закончилось ![]() |
Автор: leporel 8.5.2011, 02:03 |
borisbn, Спасибо, я просто нашел это в чужой dll, стало интересно, а своих знаний не достаточно. |