.... finalize(char *hdrs, sendip_data *headers[], int index, sendip_data *data, sendip_data *pack) { ........ 出于调试目的,我想要数据和包结构的十六进制转储,其类型为sendip_data,这是一个非常复杂的结构.实际
.... finalize(char *hdrs, sendip_data *headers[], int index, sendip_data *data, sendip_data *pack) { ........
出于调试目的,我想要数据和包结构的十六进制转储,其类型为sendip_data,这是一个非常复杂的结构.实际上它们包含一些二进制信息,所以我不确定我的项目的输出是否正确.因此,出于调试目的,我想将数据写入文件,以便我可以使用hexdump,如下所示 –
$hexdump -C file.txt
另外因为这是一个n / w数据包的运行时生成所以我也不确定数据和包结构的长度,我认为fread / fwrite将需要..所以请建议我一些东西.
以下代码将为您提供代码中任意内存的十六进制转储.#include <stdio.h> void hexDump (const char *desc, const void *addr, const int len) { int i; unsigned char buff[17]; const unsigned char *pc = (const unsigned char*)addr; // Output description if given. if (desc != NULL) printf ("%s:\n", desc); if (len == 0) { printf(" ZERO LENGTH\n"); return; } if (len < 0) { printf(" NEGATIVE LENGTH: %i\n",len); return; } // Process every byte in the data. for (i = 0; i < len; i++) { // Multiple of 16 means new line (with line offset). if ((i % 16) == 0) { // Just don't print ASCII for the zeroth line. if (i != 0) printf (" %s\n", buff); // Output the offset. printf (" %04x ", i); } // Now the hex code for the specific character. printf (" %02x", pc[i]); // And store a printable ASCII character for later. if ((pc[i] < 0x20) || (pc[i] > 0x7e)) buff[i % 16] = '.'; else buff[i % 16] = pc[i]; buff[(i % 16) + 1] = '\0'; } // Pad out last line if not exactly 16 characters. while ((i % 16) != 0) { printf (" "); i++; } // And print the final ASCII bit. printf (" %s\n", buff); } int main (int argc, char *argv[]) { char my_str[] = "a char string greater than 16 chars"; hexDump ("my_str", &my_str, sizeof (my_str)); return 0; }
您将一个描述,内存地址和长度传递给hexDump,它将输出一个十六进制转储(包括字符数据)以供检查.使用包含的main运行它时,输出为:
my_str: 0000 61 20 63 68 61 72 20 73 74 72 69 6e 67 20 67 72 a char string gr 0010 65 61 74 65 72 20 74 68 61 6e 20 31 36 20 63 68 eater than 16 ch 0020 61 72 73 00 ars.