2013-12-05 3 views
0

я использую следующую функцию для преобразования значения в шестнадцатеричном формате ASCII, чтобы:Преобразовать номер Ascii в Hex в C

void hex_to_ascii(unsigned char* buf, unsigned char number) 
{ 
    int i; 

    sprintf( buf, "%03d", number); 

    printf("\nNumber in Ascii: "); 
    for(i=0; i< 3; i++) 
    printf("%#04x ", *(buf+i)); 

    printf("\n"); 
    return; 
} 

например, Если шестнадцатеричное значение равно 0xff, функция генерирует 0x32 0x35 0x35, который представляет собой представление Ascii 255.

Теперь я хотел бы отменить операцию. Мне нужна функция, которая может быть передана три байта (массив из 3) для генерации шестнадцатеричного значения.

т.е. Переходит 0x32 0x35 0x34 и генерирует 0xFE.

Можете ли вы помочь мне с этим? Для встроенной системы значения не печатаются, они получены из буфера обмена сообщениями.

Большое спасибо.

EDIT:

Я написал это, и это, кажется, работает ..

unsigned char ascii_to_hex(unsigned char* buf) 
{ 
    unsigned char hundred, ten, unit, value; 

    hundred = (*buf-0x30)*100; 
    ten = (*(buf + 1)-0x30)*10; 
    unit = *(buf+2)-0x30;  

    value = (hundred + ten + unit); 
    printf("\nValue: %#04x \n", value); 

    return value; 
} 

Спасибо всем за ответы.

+1

Вы можете проверить [Преобразовать в ASCII строки из шестнадцатеричной строки в C] (HTTP: // stackoverflow.com/questions/17672639/convert-to-ascii-string-from-hex-string-in-c?rq=1) и [этот вопрос SO] (http://stackoverflow.com/questions/6933039/convert -two-ascii-bytes-in-one-hexadecimal-byte? rq = 1) –

+0

'number' не является« шестнадцатеричным значением », это« char », то есть целое число. Не имеет значения, вы называете 'hex_to_ascii (buffer, 0xFF)', 'hex_to_ascii (buffer, 255)' или 'hex_to_ascii (buffer, 0377)' - они все одинаковы. Обратная операция - 'scanf'. – molbdnilo

ответ

1

вы можете использовать функцию STDLIB в atoi(), чтобы преобразовать строку в целое число:

char str[] = {0x32, 0x35, 0x34, 0x00}; 
int integer = atoi(str); 
printf("%x\n", integer); 

вы можете тогда Е(), что целое число в шестнадцатеричной/дес или любой другой. Если это слишком просто для ваших нужд, то более мощной альтернативой является использование sscanf()

Если вы получаете эти целые строки из буфера связи, то вам, скорее всего, захочется сначала разбить буфер на отдельные числа (возможно, они, например, разделены пробелами). Простым способом сделать это в C будет использование strtok().

EDIT: Это изменение относится к коду, который вы добавили к своему вопросу. Я не могу комментировать ваш вопрос, поскольку у меня недостаточно репутации! Код, который вы добавили, сломан. Он будет работать только в том случае, если предоставляется трехзначная строка, например «001», «255». Если предусмотрено другое количество цифр, оно будет считываться за пределами строки и выводить вывод мусора, попробуйте «1» или «14» или «12314».

+0

Обратите внимание, что 'atoi()' не предоставляет никаких средств для адекватной обработки ошибок. Вместо этого вы можете использовать 'strtol()', даже 'sscanf()'. –

0

Вам необходимо построить ряд в base10, учитывая, что вы уже все цифры хранятся в char*buf так:

//assumtions: n - number of digits 
//   digits are ordered MSD first -> buff[0] contains the most significant digit. 
for(i=0;i<n;i++) 
    { 
     number += buf[n-i-1]*pow(10,i); //number+=digit*10^i 
    } 

    printf("%x\n", number); 
Смежные вопросы