Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Из строки в 16ричное число


Автор: BIV 25.10.2012, 15:21
Добрый день!
Подскажите пожалуйста как из строки такой записи s="00 01 ff a0 ..." перевести в 16-ричное представление, т.е. a=00 01 ff a0 ... 

Автор: Earnest 25.10.2012, 16:10
Например, strtol, с указанием правильной базы.
И это будет, конечно, не 16-ричное представление, а просто бинарное, двоичное. 16-ричное у тебя как раз сейчас.

Автор: BIV 25.10.2012, 16:54
А зачем мне 2ное??? Мне надо просто из строки в число, так как это делают atoi (или itoa). Но только не в 10 ричном представлении, а в 16. Пишу в строку "00 hh a0", получаю в переменную а=00h hhh a0h, т.е. HEX

Автор: tzirechnoy 25.10.2012, 17:25
Цитата
А зачем мне 2ное???


Возьмите Кнута первый том, и прорешайте. Поскольку это ужас что у Вас в голове, и с этим надо что-то делать, если хотите программировать.

Во-первых, в 16-ричной записи нет буквы "h" (она появляется только в 18-ричной).

В-главных, Вы вообще не понимаете, что хранится в "обычных переменных". И как оно там хранится.

Автор: BIV 25.10.2012, 18:06
Цитата(tzirechnoy @  25.10.2012,  15:25 Найти цитируемый пост)
Возьмите Кнута первый том, и прорешайте. Поскольку это ужас что у Вас в голове, и с этим надо что-то делать, если хотите программировать.Во-первых, в 16-ричной записи нет буквы "h" (она появляется только в 18-ричной).В-главных, Вы вообще не понимаете, что хранится в "обычных переменных". И как оно там хранится.


Такое рассуждение, что как будто вы знаете на все 100% зачем мне это надо

Мне нужно ввести в строковую переменную этот 16-ричный код. С помощью стандартной функции (если она есть) перевести из этой строки в переменную для отправки по TCP клиенту. Клиент читает этот код и выполняет какую-то нужную мне операцию. Если я отправлю строку "00 аа ff", то клиенту придет не 00 аа ff, а что-то другое

Добавлено через 8 минут и 17 секунд
Мне нужно сделать что-то похожее на это

http://s1.ipicture.ru/Gallery/Viewfull/13994408.html

Код там выведен в текстовом поле в виде строки. Мне надо обратное, т.е. из строки в переменную

Автор: tzirechnoy 25.10.2012, 18:34
Цитата
Такое рассуждение, что как будто вы знаете на все 100% зачем мне это надо


Если хотите программировать -- это абсолютно необходимо. И, судя по тому, что Вы на Си пытаетесь что-то отправить по TCP -- Вам это за каким-то чёртом нужно.

Впрочем, конечно, есть варианты: например, нанять программиста для этой работы.

Автор: BIV 25.10.2012, 18:38
Прочитайте, пожалуйста, 5 сообщение

Добавлено через 3 минуты и 32 секунды
Я хочу в текстовом поле написать буквами и цифрами 16 ричную последовательность. Перевести это написанное в HEX

Автор: BIV 25.10.2012, 21:16
Цитата(Earnest @ 25.10.2012,  14:10)
Например, strtol, с указанием правильной базы.
И это будет, конечно, не 16-ричное представление, а просто бинарное, двоичное. 16-ричное у тебя как раз сейчас.

Да,извините,я не так понял. Ну почти. Если в двойном, то
"11 ab ff" в 000100011010101111111111
полученное значение в переменную 

Автор: feodorv 25.10.2012, 23:47
Код

#include <stdio.h>

int charFromHex( char hex )
{
  if( hex >= '0' && hex <= '9' ) return hex - '0';
  if( hex >= 'A' && hex <= 'F' ) return hex - 'A' + 10;
  if( hex >= 'a' && hex <= 'f' ) return hex - 'a' + 10;
  return -1;
}

int strFromHex( unsigned char *bin, int maxsize, const char *str, const char **rest)
{
  int len = 0;

  for( ;; )
  {
    int v1, v2;

    if( len >= maxsize ) break;
    while( *str == ' ' ) str++;
    if( str[0] == '\0' || str[1] == '\0' ) break;

    v1 = charFromHex( str[0] );
    v2 = charFromHex( str[1] );
    if( v1 < 0 || v2 < 0 ) break;

    bin[len++] = (v1 << 4) + v2;
    str++;
    str++;
  }

  if( rest != NULL ) *rest = str;
  return len;
}

int main( void )
{
  char *input = "ff 11 27 9e Aa none";
  unsigned char output[3];
  int i, len;

  len = strFromHex( output, 3, input, NULL);

  for( i = 0; i < len; i++) printf( "%d %.2x\n", i, output[i]);
  return 0;
}

Автор: BIV 26.10.2012, 21:25
То что надо, спасибо Вам огромное!

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