2015-12-17 2 views
3

char readBuf[] = "96 36 D4 D1 F8 C1 8A E0 BF 29 10 91 3C 4D F1 5D 08";Преобразование uint8_t массив значений их шестнадцатеричных эквивалентов в массив символов

Я хотел бы перевести каждую пару значений в шестнадцатиричное значение, так что у меня есть 17 отдельных шестнадцатеричные значения в новом полукокса [].

Результат будет эквивалентно написанию этого в коде:

char hexStr[] = {0x96, 0x36, 0xD4, 0xD1, 0xF8, 0xC1, 0x8A, 0xE0, 0xBF, 0x29, 0x10, 0x91, 0x3C, 0x4D, 0xF1, 0x5D, 0x08}

Я не знаю, как построить новое шестнадцатеричное значение из readBuf, чтобы добавить его к новому полукокса [].

+0

Ваши результаты не имеет смысла для меня. readBuf [1] является «6» и сопоставляется с 0x36 в asciiStr, но readBuf [4] также является «6» и сопоставляется с 0xF8. Я что-то упускаю? – nicomp

+0

Я обновил, надеюсь, сделать его более ясным и удалить последний комментарий, который смущает вещи! – Justyn

+0

И вопрос в том, что? – Olaf

ответ

1

Что-то вроде этого:

char readBuf[] = "96 36 D4 D1 F8 C1 8A E0 BF 29 10 91 3C 4D F1 5D 08"; 
size_t length = strlen(readBuf); 
// ideally the length of this should be computed from the string length and allocated dynamically 
uint8_t result[17]; 
size_t pos = 0; 
while(pos * 3 < length) { 
    int value; 
    int scanned = sscanf(readBuf + pos * 3, "%x", &value); 
    if(scanned == 1) { 
     result[pos] = value; 
     pos ++; 
    } else { 
     fprintf(stderr, "Invalid hex number at %zu", pos * 3); 
     break; 
    } 
} 
+0

Спасибо Крису, это намного более компактно и устраняет необходимость использования метода hex для int. Он также включает обработку ошибок для недопустимых шестнадцатеричных чисел. В результате я обновил правильный ответ на этот вопрос. Если кто-то видит причину, почему это не должно быть принятым ответом, пожалуйста, включите чип. – Justyn

Смежные вопросы