![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
lifespirit |
|
||||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 16.5.2011 Репутация: нет Всего: нет |
Есть программа, принимающая данные от клиента по порту 25565. Клиент высылает данные в специальном виде: первый байт - код пакета, второй + третий байт - длинна строки, третий и последующие байты - строка. Вот пример: 2 0 a 0 6c 0 69 0 66 0 65 0 73 0 70 0 69 0 72 0 69 0 74. Код пакета 2, длинна строки A (10), а дальше идет текст (lifespirit) в виде байт таблицы символов. Проблема в том, что мне нужно каким то образом превратить байты теста в char[], который можно сравнить с ответом MySQL сервера на запрос из таблицы. Плюс к этому помимо английского текста строка может оказаться заполненной русскими буквами, а это значит что нельзя убирать двухбайтность символа (потому что русские буквы кодируются двумя байтами где первый байт 04, а второй байт - байт символа).
Вот код Stream:
Вот код MySQL обработчика:
Таблица при отработке своего кода честно выводит строку (lifespirit), которая не может вывестись с помощью printf("%x", row[i]); программа же, принимающая данные может выводить свою строку хоть в десятичном, хоть 16-ричном виде, но ничего не покажет по запросу printf("%s",buff);. Мне нужно: 1. Как то сравнить сидержимое row[i] и ту часть buff, в которой зашифрована строка, при этом желательно все же представить текстовую часть buf в виде строки 2. Если это невозможно, то хотя бы сравнить в любом состоянии buff и row[i]. Я пока что не вижу другого выхода кроме как написать функцию перевода бвухбайтовых чисел в буквы, но эта функция будет очень тяжелой для компьютера и не очень надежной (не все символы переведуться). Можно ли реализовать 1 или 2 средствами C++? P.S. Использую компилятор g++ под linux'ом. MySQL код собираю командой "g++ -omysql mysqlserv.cpp -lmysqlclient" Это сообщение отредактировал(а) lifespirit - 16.5.2011, 23:59 |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
сделай преобразование в utf-8
|
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Во первых - вам надо распарсить данные из сокета и выделить строку (и она будет в wchar_t, а не в char). Строку можно сложить в std::wstring. Так же учтите, что данные из recv совсем не обязательно будут приходить нарезанные строго по границам пакетов, границы вам придется восстанавливать самому.
Во вторых, надо принятую стоку привести к той же кодировке, что возвращает mysql. А они могут быть самые разные. А потом уже можно сравнивать |
|||
|
||||
lifespirit |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 16.5.2011 Репутация: нет Всего: нет |
xvr, а можно поподробнее? И если не тяжело то в коде, а то я новичок, мало что понял. А насчет пакетов. клиент шлет очень маленькие ответы, они влазят в 1 пакет TCP 100%, а сервер может резать свой ответ как хочет. На стороне клиента восстановление пакетов давно реализовано. Благо этим занимаюсь не я.
![]() Это сообщение отредактировал(а) lifespirit - 17.5.2011, 23:31 |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Кода будет довольно много, так что я пожалуй его писать не буду ![]()
Вот набросок обработчика пакета:
На каждый принятый через recv байт вызываете PktProcess::add_byte, когда объект наберет полный пакет, он вызовет метод pkt_recieved с типом пакета и принятой Unicode строкой |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |