Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to get hexdump of a structure data

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

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 

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.

like image 306
Udit Gupta Avatar asked Oct 15 '11 05:10

Udit Gupta


People also ask

How do you read Hexdump output?

The address of a hex dump counts tracks the number of bytes in the data and offsets each line by that number. So the first line starts at offset 0, and the second line represents the number 16, which is how many bytes precede the current line.

How many bytes is a Hexdump?

Hex dumps are commonly organized into rows of 8 or 16 bytes, sometimes separated by whitespaces.

What does Hexdump command do?

Hexdump is a utility that displays the contents of binary files in hexadecimal, decimal, octal, or ASCII. It's a utility for inspection and can be used for data recovery, reverse engineering, and programming.

What is XXD in Hexdump?

DESCRIPTION. xxd creates a hex dump of a given file or standard input. It can also convert a hex dump back to its original binary form. Like uuencode(1) and uudecode(1) it allows the transmission of binary data in a `mail-safe' ASCII representation, but has the advantage of decoding to standard output.


1 Answers

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:\n", desc);      // Length checks.      if (len == 0) {         printf("  ZERO LENGTH\n");         return;     }     if (len < 0) {         printf("  NEGATIVE LENGTH: %d\n", 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\n", 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] = '\0';     }      // Pad out last line if not exactly perLine characters.      while ((i % perLine) != 0) {         printf ("   ");         i++;     }      // And print the final ASCII buffer.      printf ("  %s\n", 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; } 

You pass into hexDump a description, memory address, length, and how many bytes you want on each line.

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. 
like image 94
paxdiablo Avatar answered Sep 19 '22 21:09

paxdiablo