2013-07-12 213 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就足夠了。 – 2013-07-12 18:06:33

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); 
} 

比使用格式化的[s] print [f]開銷更快,並且不依賴於語言環境。您對堆棧緩衝區要求也有嚴格的限制:16x9 = 144個字節(0x90)。

相關問題