2013-07-12 2 views
0

Я написал эту функцию C для отправки массива из 32 байтов для отладки вывода в виде строки. В коде есть четкое повторение. Как я могу сделать его более аккуратным? Точный формат не имеет значения.Печать длинных шестнадцатеричных строк

// data is guaranteed to be 32 long 
void debug_log_32B(uint8_t *data) { 
    char debug_msg[100]; 
    char fmt[] = "%02X%02X %02X%02X %02X%02X %02X%02X %02X%02X %02X%02X %02X%02X %02X%02X %02X%02X %02X%02X %02X%02X %02X%02X %02X%02X %02X%02X %02X%02X %02X%02X"; 
    sprintf(debug_msg, fmt, 
     data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8], data[9], 
     data[10], data[11], data[12], data[13], data[14], data[15], data[16], data[17], data[18], data[19], 
     data[20], data[21], data[22], data[23], data[24], data[25], data[26], data[27], data[28], data[29], 
     data[30], data[31] 
    ); 
    debug_log(debug_msg); 
} 

Даже если я создал строку формата в цикле, то sprintf заявление будет еще долго. Или код достаточно понятен?

ответ

3

Введите понятие петель:

char buf[0x100]; 

for (int i = 0; i < 16; i++) { 
    sprintf(buf + i * 5, "%02X%02X ", data[2 * i], data[2 * i + 1]); 
} 

debug_log(buf); 
+0

+1 Ницца и в точку. Может быть полезно, почему 0x100 против OP 100 против 5 * 16 + 1 - но это нит. – chux

+0

@chux Спасибо. Это общий размер буфера «один размер подходит всем». Но да, 81 было бы достаточно. –

0

Там приходит момент, когда это имеет смысл обрабатывать эти вещи явно; в противном случае более надежное решение будет опираться на snprintf.

void debug_log_32B (uint8_t *data) 
{ 
    char debug_msg[0x100]; 
    char *ptr = debug_msg; 

    for (int i = 0; i < 16; i++) 
    { 
     static const char *digits = "ABCDEF"; 
     uint8_t u0 = data[i * 2], u1 = data[i * 2 + 1]; 

     *ptr++ = '0'; *ptr++ = 'X'; 
     *ptr++ = digits[(u0 >> 4) & 0xf]; *ptr++ = digits[u0 & 0xf]; 
     *ptr++ = '0'; *ptr++ = 'X'; 
     *ptr++ = digits[(u1 >> 4) & 0xf]; *ptr++ = digits[u1 & 0xf]; 

     if (i < 15) *ptr++ = ' '; 
    } 

    *ptr++ = (0); 
    debug_log(debug_msg); 
} 

быстрее, чем при использовании форматированный [с] печать [F] накладные, а не в зависимости от районов. У вас также есть строгая привязка к требованиям буфера стека: 16x9 = 144 байта (0x90).