如何获取结构数据的十六进制转储 [英] how to get hexdump of a structure data
问题描述
....
finalize(char *hdrs, sendip_data *headers[], int index,
sendip_data *data, sendip_data *pack)
{
........
出于调试目的,我想要 data
和 pack
结构的十六进制转储,它们属于 sendip_data
类型,这是一个非常复杂的结构.实际上它们包含一些二进制信息,所以我不确定我的项目的输出是否正确.所以出于调试目的,我想将数据写入文件,以便我可以使用 hexdump 如下 -
For debugging purposes I want a hex dump of the data
and pack
structures, which are of type sendip_data
, a really complex structure. Actually they contain some binary information so I am not sure whether output of my project is correct or not. So for debugging purposes, I want to write the data into a file so that I can use hexdump as follows -
$hexdump -C file.txt
此外,由于这是 an/w 数据包的运行时生成,因此我也不确定 data
和 pack
结构的长度,我认为 fread/fwrite
需要..所以请给我建议.
Also as this is a run time generation of a n/w packet so I am also not sure about the length of data
and pack
structure which I think fread / fwrite
will require ..So please suggest me something.
推荐答案
以下代码将为您提供代码中任意内存的十六进制转储.
The following code will give you a hex dump of arbitrary memory from within your code.
#include <stdio.h>
// Usage:
// hexDump(desc, addr, len, perLine);
// desc: if non-NULL, printed as a description before hex dump.
// addr: the address to start dumping from.
// len: the number of bytes to dump.
// perLine: number of bytes on each output line.
void hexDump (
const char * desc,
const void * addr,
const int len,
int perLine
) {
// Silently ignore silly per-line values.
if (perLine < 4 || perLine > 64) perLine = 16;
int i;
unsigned char buff[perLine+1];
const unsigned char * pc = (const unsigned char *)addr;
// Output description if given.
if (desc != NULL) printf ("%s:
", desc);
// Length checks.
if (len == 0) {
printf(" ZERO LENGTH
");
return;
}
if (len < 0) {
printf(" NEGATIVE LENGTH: %d
", len);
return;
}
// Process every byte in the data.
for (i = 0; i < len; i++) {
// Multiple of perLine means new or first line (with line offset).
if ((i % perLine) == 0) {
// Only print previous-line ASCII buffer for lines beyond first.
if (i != 0) printf (" %s
", buff);
// Output the offset of current line.
printf (" %04x ", i);
}
// Now the hex code for the specific character.
printf (" %02x", pc[i]);
// And buffer a printable ASCII character for later.
if ((pc[i] < 0x20) || (pc[i] > 0x7e)) // isprint() may be better.
buff[i % perLine] = '.';
else
buff[i % perLine] = pc[i];
buff[(i % perLine) + 1] = ' ';
}
// Pad out last line if not exactly perLine characters.
while ((i % perLine) != 0) {
printf (" ");
i++;
}
// And print the final ASCII buffer.
printf (" %s
", buff);
}
// Very simple test harness.
int main (int argc, char *argv[]) {
char my_str[] = "a char string greater than 16 chars";
hexDump ("my_str", &my_str, sizeof (my_str), 16);
return 0;
}
您向 hexDump
传递描述、内存地址、长度以及每行所需的字节数.
You pass into hexDump
a description, memory address, length, and how many bytes you want on each line.
它将输出一个十六进制转储(包括字符数据)以供检查.当您使用包含的 main
运行它时,输出为:
It will output a hex dump (including character data) for examination. When you run it with the included main
, the output is:
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.
这篇关于如何获取结构数据的十六进制转储的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!