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