Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Как получить hex значение из string?


Автор: TheDestroyer 7.6.2009, 23:10
Здравствуйте. Подскажите пожалуйста как получить 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.

Автор: mes 7.6.2009, 23:22
Цитата(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

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

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 для моего случая?

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


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

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


Автор: TheDestroyer 9.6.2009, 11:53
Спасибо, 
Цитата(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;

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

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

Автор: xvr 9.6.2009, 12:26
Цитата(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);


Автор: andrew_121 9.6.2009, 13:08
xvr, Думаю стОит дополнить.
Далее работаете с р вместо data_h.

Автор: TheDestroyer 9.6.2009, 13:27
Спасибо, сформировал так:
Код

  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). Может есть другой способ?

Автор: xvr 9.6.2009, 13:52
Есть. Сделать указатель записи и функцию 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;

Автор: andrew_121 9.6.2009, 14:34
xvr, Ух ты smile  Красивенько получилось!

Автор: TheDestroyer 11.6.2009, 12:05
Да, отлично, спасибо!

Автор: Andrey44 11.6.2009, 12:18
Код

int send_size = p-data_h;

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

Автор: xvr 11.6.2009, 13:31
Цитата(Andrey44 @ 11.6.2009,  12:18)
Код

int send_size = p-data_h;

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

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

Но это уже топикстартер пусть сам реализует  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)