打印长十六进制字符串

时间:2013-07-12 17:42:59

标签: c printf

我已经编写了这个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语句仍然很长。或者代码是否足够清晰?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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 = "0123456789ABCDEF";
        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)。