HEX Viewer
The hexview.h is a simple file to add to your project to print out a hexview of a memory region with a given length. I've used it to debug Ethernet stuff and the lwip classes. It was very helpful, so I've decided to share it and make a more advanced version.
On the right you can see the demo application. You can find it on the bottom.
I'm pretty sure it is not only useful for Ethernet ;-)
/* Function: hexview
* Prints an array of char to stdout in hex.
* The data is grouped in two 8 byte groups per line.
* Each byte is displayed as 2 hex digits and every
* line starts with the address of the first byte.
*
* There is no text view of a line.
*
* Variables:
* buffer - The array to display.
* size - The length of buffer.
*
* Author: rmeyer
*/
inline void hexview(const char *buffer, unsigned int size) {
printf("\n");
for(int i = 0; i < size; ++i) {
if((i%16)!=0) {
printf(" ");
} else {
printf("%04X: ", (i));
}
printf("%02hhx", buffer[i]);
if((i%16) == 7) {
printf(" ");
}
if((i%16) == 15) {
printf("\n");
}
}
printf("\n\n\n");
} An improved version which uses more RAM but less often printf. It prints the char representation of the data as well:
/* Function: hexview
* Prints an array of char to stdout in hex.
* The data is grouped in two 8 byte groups per line.
* Each byte is displayed as 2 hex digits and every
* line starts with the address of the first byte.
* Each line ends ub with an ASCII representation
* of the bytes.
*
* This implementation takes more stack space than the other.
* It will allocate two char arrays with a agregated size of 70 bytes.
* Therefore its faster than the fierst implementation.
* It operates directly on the char arrays and make no use of
* string manipulation functions. printf is called one time a line.
*
* Variables:
* buffer - The array to display.
* size - The length of buffer.
*/
inline void hexview(const char *buffer, unsigned int size) {
char byte[50];
char text[20];
bool big = false;
int i;
for(i = 0; i < size; ++i) {
if((i&0xF) == 0x0) {
if(big)
printf("%04X: %-49s: %-20s\n", (i&~0xF), byte, text);
big = false;
byte[0] = '\0';
text[0] = '\0';
} else if((i&0xF) == 0x8) {
big = true;
byte[(i&0xF) * 3] = ' ';
text[(i&0xF)] = ' ';
}
unsigned char value = buffer[i];
text[(i&0xF) + 0 + big] = (value < 0x20 || value > 0x7F)? '.': value;
text[(i&0xF) + 1 + big] = '\0';
value = (buffer[i] &0xF0) >> 4;
byte[(i&0xF) * 3 + 0 + big] = (value < 0xA)? (value + 0x30): (value + 0x37);
value = (buffer[i] &0x0F);
byte[(i&0xF) * 3 + 1 + big] = (value < 0xA)? (value + 0x30): (value + 0x37);
byte[(i&0xF) * 3 + 2 + big] = ' ';
byte[(i&0xF) * 3 + 3 + big] = '\0';
}
if(byte[0]) {
printf("%04X: %-49s: %-20s\n", (i&~0xF), byte, text);
}
printf("\n");
} A demo how to use it with the Ethernet class is here: ethersniff_hex
1 comment
You need to log in to post a comment

Useful keeps the bandwidth requirements down :)