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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить hex значение из string? 
V
    Опции темы
TheDestroyer
Дата 7.6.2009, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте. Подскажите пожалуйста как получить hex значение из string. Мне надо отослать последовательность байт в hex, но получается, что они преобразовываются в ASCII:
Код

int send(SOCKET sock, int id, int command, char *string1, char *string2){
int size, ret;
  string data, p_id_s, com_s, size_s;
  char p_id_h[100], com_h[100], size_h[100];
  char data_h[100];
  ++p_id;
  itoa(p_id,p_id_h,16);
  itoa(command,com_h,16);
  p_id_s = p_id_h;
  com_s = com_h;

data = p_id_s+'\0'+com_s+'\0'+string1+'\0'+string2+'\0';
// в data на пером месте вместо 13h находится два байта 31h и 39h
ret = send(sock,data.c_str(),data.length(),0);
}
Как получить длину data в hex одним байтом, чтобы потом его переслать?

Вообще должен быть способ намного проще сформировать data.

Это сообщение отредактировал(а) TheDestroyer - 7.6.2009, 23:10
PM MAIL   Вверх
mes
Дата 7.6.2009, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(TheDestroyer @  7.6.2009,  22:10 Найти цитируемый пост)
Мне надо отослать последовательность байт в hex, но получается, что они преобразовываются в ASCII:

любое значение хранится в памяти в бинарном виде, и может быть представлено и как hex и как dec и как символ:
Код

  int i=77;
  std::cout << std::hex << i <<" ";
  std::cout << std::dec << i <<" ";
  std::cout << (char) i << std::endl;

покажите из чего и что Вы хотите получить, без лишних деталей, а то и себя запутаете и остальных.smile



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


Шустрый
*


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

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



Да, точно, пример-то не привел...
Код должен был выглядеть так:
Код

int send(SOCKET sock, int id, int command, char *string1, char *string2){
  int size, ret;
  string data, p_id_s, com_s, size_s;
  char p_id_h[100], com_h[100], size_h[100];
  char data_h[100];

  ++p_id;
  itoa(p_id,p_id_h,16);
  itoa(command,com_h,16);
  p_id_s = p_id_h;
  com_s = com_h;
  data = p_id_s+'\0'+com_s+'\0'+string1+'\0'+string2+'\0';

  // запишем длину пакета
   size = data.length();
  itoa(size,size_h,16);
  size_s = size_h;

  // составим пакет
  data = size_s+'\0'+data;
  // пошлем запрос
  ret = send(sock,data.c_str(),data.length(),0);
}
пример:
Код

send(sock, 1, 3, "string1", "");

В итоге получается в data = p_id_s+'\0'+com_s+'\0'+string1+'\0'+string2+'\0'; строка
31 0 33 0 73 74 72 69 6E 67 31 0 0
вместо
01 0 03 0 73 74 72 69 6E 67 31 0 0
также и с длиной:
size_s = d, надо записать это d одним байтом не в ASCII d=64h, а 0d
в итоге выходит после data = size_s+'\0'+data; в data содержится :
64 0 31 0 33 0 73 74 72 69 6E 67 31 0 0
вместо
0d 0 01 0 03 0 73 74 72 69 6E 67 31 0 0
Подскажите как из int и строк правильно получить, видимо, char для моего случая?
PM MAIL   Вверх
mes
Дата 8.6.2009, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



ну написано же было :
Цитата(mes @  7.6.2009,  22:22 Найти цитируемый пост)
без лишних деталей, 


как я понял : 
у Вас есть массив char data[100]; 
и к примеру int size= 0xde;
Вам нужно чтоб первый (с индексом 0) байт у data был 0xde ?

если значение в size помещается в байте, то data[0] = size;




--------------------
PM MAIL WWW   Вверх
TheDestroyer
Дата 9.6.2009, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо, 
Цитата(mes @  8.6.2009,  00:38 Найти цитируемый пост)
без лишних деталей, 

детали привел, т.к. наверняка есть более простой способ сформировать такую последовательность.

Возникла следующая проблема:
составляю пакет для передачи, не знаю как правильно вписать в массив data строку неизвестной длины, делаю так:
Код

int send(SOCKET sock, int id, int command, char *string1, char *string2){
int p_id;
char data_h[100];
...
// составим пакет
  data_h[0] = size;
  data_h[1] = 0;
  data_h[2] = p_id;
  data_h[3] = 0;
  data_h[4] = command;
  data_h[5] = *string1; // здесь строка неизвестной длины, надо ее полностью вставить в массив для отправки и записать еще строку после нее
  data_h[sizeof(string1)] = 0;
  data_h[sizeof(string1)+1] = *string2;
  data_h[sizeof(string2)] = 0;

Как правильно сформировать такой массив?

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


Шустрый
*


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

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



Решил проблему с добавлением строки произвольной длинны с помощью функции strcat
UPD:
Не совсем решил,т.к. после использования этой функции затирается все то, что было добавлено в массив ранее.
Неужели другого выхода как перебирать все элементы в цикле и вставлять их в массив data нет?

Это сообщение отредактировал(а) TheDestroyer - 9.6.2009, 12:21
PM MAIL   Вверх
xvr
Дата 9.6.2009, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(TheDestroyer @ 9.6.2009,  11:53)
Возникла следующая проблема:
составляю пакет для передачи, не знаю как правильно вписать в массив data строку неизвестной длины, делаю так:

Код

int send(SOCKET sock, int id, int command, char *string1, char *string2){
int p_id;
char data_h[100];
...
// составим пакет
  data_h[0] = size;
  data_h[1] = 0;
  data_h[2] = p_id;
  data_h[3] = 0;
  data_h[4] = command;
/* Бред :(
  data_h[5] = *string1; // здесь строка неизвестной длины, надо ее полностью вставить в массив для отправки и записать еще строку после нее
  data_h[sizeof(string1)] = 0;
  data_h[sizeof(string1)+1] = *string2;
  data_h[sizeof(string2)] = 0;
*/
 strcpy(data_h+5,command);
 char* p=data_h+5+strlen(data_h+5)+1;
 strcpy(p,string2);


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


Кодофей
****


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

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



xvr, Думаю стОит дополнить.
Далее работаете с р вместо data_h.


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


Шустрый
*


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

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



Спасибо, сформировал так:
Код

  data_h[0] = size;
  data_h[1] = 0;
  data_h[2] = p_id;
  data_h[3] = 0;
  data_h[4] = command;
  strcpy(data_h+5,string1);
  strcpy(data_h+5+strlen(string1)+1,string2);
  int send_size = 5+strlen(string1)+1+strlen(string2)+1;

при передаче требуется указать число байт для отправки, просто подсчитать число байт в data_h не правильно (т.е. strlen и sizeof возвращают неверный результат).
Код

ret = send(sock,data_h,send_size,0);

Необходимо указать число байт, записанных в data_h. В приведенном коде считаю их вручную (send_size). Может есть другой способ?

PM MAIL   Вверх
xvr
Дата 9.6.2009, 13:52 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Есть. Сделать указатель записи и функцию stpcpy (кое где она есть по умолчанию)
Код

char* stpcpy(char* dst, const char* src)
{
 strcpy(dst,src);
 return dst+strlen(dst);
}

Далее так
Код

char data_h[100];
char* p=data_h;
*p++ = size;
*p++ = 0;
*p++ = p_id;
*p++ = 0;
*p++ = command;
p = stpcpy(p,string1)+1;
p = stpcpy(p,string2)+1;
int send_size = p-data_h;

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


Кодофей
****


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

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



xvr, Ух ты smile  Красивенько получилось!


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


Шустрый
*


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

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



Да, отлично, спасибо!
PM MAIL   Вверх
Andrey44
Дата 11.6.2009, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

int send_size = p-data_h;

Тут не мешало-бы сделать проверку на send_size>100


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
xvr
Дата 11.6.2009, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Andrey44 @ 11.6.2009,  12:18)
Код

int send_size = p-data_h;

Тут не мешало-бы сделать проверку на send_size>100

Это не мешало бы сделать еще на этапе *p++= .... Но тут без какой нибудь обвертки не обойтись. (В виде класса, или на худой конец дефайна)

Но это уже топикстартер пусть сам реализует  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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