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