2014-11-14 8 views
0

является преобразование неподписанного символа/INT в шестнадцатеричный, проблеме нет правильной перевода ascci таблицы: оригинала: 0D, преобразованный: AD кода:C Conver неподписанного символ в HEX

char int_to_hex(int d) { 
    if (d < 0) return -1; 
    if (d > 16) return -1; 
    if (d <= 9) return '0' + d; 
    d -= 10; 
    return (char)('A' + d); 
} 
void uint_to_hex(unsigned char in, char **out, int *olen) { 
    int i = 0; 
    int remain[2]; 
    int result = (int)in; 

    while (result) { 
     remain[i++] = result % 16; 
     result /= (int)16; 
    } 
    for (i = 1; i >= 0; --i) { 
    char c = int_to_hex(remain[i]); 
    if((int)c == -1) { continue; } 
    *((*out) + (*olen)) = (char)c; (*olen)++; 
    } 
} 

где неправильно ..

+0

Это 'out' довольно странно, вы должны, вероятно, показать, как вы это называете. Кроме того, почему бы не использовать, например. 'snprintf()' для этого? – unwind

+0

что такое ошибка? – 4pie0

+0

Возможно, плохой вызывающий. – BLUEPIXY

ответ

1

Прежде всего, одна шестнадцатеричная цифра будет охватывать значения от 0 (0) до 15 (F) не от 0 до 16 (как вы, кажется, принимаете в функции int_to_hex).
Также в последнем возврате этой функции вам не нужно приведение типов к char.
На самом деле все здесь приведения типов, а ненужный
И типажи буквального 16 чисто абсурд ...

И как образец для ввода uint_to_hex смотрит? Вы знаете, что на входе (in) вы можете пройти только один char актер?

Я думаю, что указатель на символ был бы достаточным для out - я имею в виду, вы хотите вернуть массив, не так ли? Итак, вместо ** должен быть только петь *.
И я не понимаю, почему olen должен быть указателем (и аргументом для функции тоже).

И вы должны попытаться написать более сжатый и читаемый код, это поможет вам понять, что вы делаете.

+0

Да, пропустить только один символ – Den68