C++ 打印缓存区数据 十六进制格式

时间:2021-12-13 03:59:28

1、调试C++程序时,有时可能需要以16进制打印输出缓存区数据,以定位跟踪问题,现提供其实现的代码:

void printHex(char* buff, int buff_len)
{
    char *str = (char*)malloc(buff_len * sizeof(char)*2 + 1);
    if (str != NULL) {
        int ret = 0;
        bzero(str, buff_len * sizeof(char)*2 + 1);
        //memset(str, '\0', buff_len * sizeof(char)*2 + 1);
        for (int i = 0; i < buff_len; i++) {
            ret += sprintf(str + ret, "%02x", buff[i]);
        }
        printf("buff_hex_str:%s\r\n", str);
        free(str);
    }
}

 

2、以上打印16进制的实现,虽可适配缓存区大小,将缓存区所有字符都打印输出,但每次都需要动态申请大量内存,可能会导致大量内存碎片,或者无法申请到足够内存而不能打印。由于打印日志的目的一般是定位问题,只需要打印部分即可。因而,解决方案是只打印缓存区前面16个字符。代码示例如下:

void printHex(char* buff, int buff_len)
{
    char str[33];
    bzero(str, 33);
    int ret = 0;
    for (int i = 0; i < 16 && i < buff_len; i++) {
        ret += sprintf(str + ret, "%02x", buff[i]);
    }
    printf("buff_hex_str:%s\r\n", str);
}