如何得到一个结构化数据的hexdump都 [英] how to get hexdump of a structure data

查看:399
本文介绍了如何得到一个结构化数据的hexdump都的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 ....
 finalize(char *hdrs, sendip_data *headers[], int index,
                    sendip_data *data, sendip_data *pack)
 {

 ........

有关调试的目的,我想数据的十六进制转储结构,这是键入<的code> 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

此外,因为这是一个运行时产生的/ w的数据包,所以我也不能确定数据的长度结构,我觉得 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.

推荐答案

以下code会给你任意内存的十六进制转储从code之内。

The following code will give you a hex dump of arbitrary memory from within your code.

#include <stdio.h>

void hexDump (char *desc, void *addr, int len) {
    int i;
    unsigned char buff[17];
    unsigned char *pc = (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都描述,内存地址和长度,它会检查输出的十六进制转储(包括字符数据)。当你运行它包含的,输出是:

You pass into hexDump a description, memory address and length, and 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.

这篇关于如何得到一个结构化数据的hexdump都的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆