Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> преобразование байтов в int, как из 6 байт получить 10 значное число 
:(
    Опции темы
fire64
Дата 21.8.2009, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



есть буфер состоящий из 10 байт

мне нужно взять последние 4 байта и составить из них десятизначное число

вот приблизительный код того что я пытался сделать

Код


char msg[MAX_MSG];

char meseg[MAX_MSG];

recvfrom(name_sock, msg, MAX_MSG, 0, (sockaddr  *) &server_addr, &server_addr_size);

for(int i = 5; i < nNumRead; i++)
{
        sprintf(meseg, "%s%d",meseg, msg[i] );
}

printf("printf %s \n", meseg);


я нашел похожий код, но он не на C++

там превращение байт в int выглядит так

int s = BitConverter.ToInt32(receiveBytes, 6);



Это сообщение отредактировал(а) fire64 - 21.8.2009, 13:31
PM MAIL   Вверх
andrew_121
Дата 21.8.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Код

char msg[MAX_MSG];
char meseg[MAX_MSG];
recvfrom(name_sock, msg, MAX_MSG, 0, (sockaddr  *) &server_addr, &server_addr_size);
int v = atoi(msg+(strlen(msg)-4));


Добавлено через 8 минут и 16 секунд
Или так:
Код

char msg[MAX_MSG];
char meseg[MAX_MSG];
recvfrom(name_sock, msg, MAX_MSG, 0, (sockaddr  *) &server_addr, &server_addr_size);
std::string temp(msg);
temp = temp.substr(temp.length()-4);
std::stringstream ss;
ss << temp;
int v;
ss >> v;


Это сообщение отредактировал(а) andrew_121 - 21.8.2009, 14:12


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
fire64
Дата 21.8.2009, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



а может лучше

long test = *(long *)(msg+ strlen(msg)-4);

насколько я помню long состоит из 4 байт

Это сообщение отредактировал(а) fire64 - 21.8.2009, 14:50
PM MAIL   Вверх
andrew_121
Дата 21.8.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(fire64 @  21.8.2009,  14:30 Найти цитируемый пост)
а может лучше

long test = *(long *)(msg + 6);

насколько я помню long состоит из 4 байт 

Насколько я заметил, нигде не сказано что целое в массиве в виде RAW


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
fire64
Дата 21.8.2009, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



andrew_121, оба варианта которые ты предложил выдают 0
PM MAIL   Вверх
andrew_121
Дата 21.8.2009, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



fire64, покажи как ты число передаешь.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
fire64
Дата 21.8.2009, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



Короче вот мой код

думаю в нем содержится вся нужная информация

Код

    char msg[MAX_MSG];

    char meseg[MAX_MSG];

    memset(msg,0x0,MAX_MSG);
    memset(meseg,0x0,MAX_MSG);


    int server_addr_size=sizeof (server_addr);

    int nNumRead = recvfrom(name_sock, msg, MAX_MSG, 0, (sockaddr  *) &server_addr, &server_addr_size);

    long test = *(long *)(msg + strlen(msg)-4);

    printf("test %d \n", test);
    
    char adding[MAX_MSG];

    memset(adding,0x0,MAX_MSG);

    sprintf( adding, "0\n\\protocol\\47\challenge\\%i\\players\\0\\max\\16\\bots\\0\\gamedir\\hcm\\map\\st_01_done\\type\\d\\password\\0\\os\\w\\secure\\0\\lan\\0\\version\\1.1.2.0\\region\\255\\product\\valve\n", test );

    sendto(name_sock, adding, strlen( adding ), 0,(sockaddr  *)  &server_addr, sizeof(server_addr));


PM MAIL   Вверх
andrew_121
Дата 21.8.2009, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(fire64 @  21.8.2009,  15:04 Найти цитируемый пост)
int nNumRead = recvfrom(name_sock, msg, MAX_MSG, 0, (sockaddr  *) &server_addr, &server_addr_size);

покажи код который передает данные, которые принимает эта функция.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
fire64
Дата 21.8.2009, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



andrew_121, к сожалению я не могу дать тебе код мастер сервера, так как у меня его и нет

могу лишь дать ссылку на документацию

http://developer.valvesoftware.com/wiki/Ma..._Query_Protocol

The master servers each respond by sending FF FF FF FF 73 0A followed by a (relatively) unique 4-byte "challenge" number. If you send the master servers an invalid challenge, you will get another challenge as a response. 



 


PM MAIL   Вверх
andrew_121
Дата 21.8.2009, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



покажи в виде HEX то что ты получаешь.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
fire64
Дата 21.8.2009, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



ок

FF FF FF FF 73 0A 94 4F 26 67

теперь о значении байтов

FF FF FF FF - означает что это информационный пакет
73  -  's' - указывает тип пакета, в данном случае  challenge number от  мастер сервера

94 4F 26 67 - сам challenge number

в конечном результате challenge number должен состоять из 10 цифр


Вот пакеты от официального клиента

пакет от мастер сервера

FF FF FF FF 73 0A B5 1B 1E 70

а вот что отвечает клиент

\protocol\47\challenge\1881021365\players\0\max\16\bots\0\ и т.д.

как видишь клиент преобразовал  B5 1B 1E 70 в 1881021365

сейчас на основе правильных пакетов выяснил правильный код

int test = *(unsigned int *)(msg+7);



Это сообщение отредактировал(а) fire64 - 21.8.2009, 16:51
PM MAIL   Вверх
Albor
Дата 21.8.2009, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Цитата(fire64 @  21.8.2009,  16:34 Найти цитируемый пост)
int test = *(unsigned int *)(msg+7);

Должно быть +6, точнее  - msg+MAX_MSG-sizeof(unsigned int), что даст ту же 6.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0490 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.