A simple example how to receive ethernet packages and display them over stdout with an hexviewer

Dependencies:   mbed

Committer:
rolf
Date:
Wed Dec 09 11:36:29 2009 +0000
Revision:
0:2f61a610595e

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rolf 0:2f61a610595e 1 /* hexview functions
rolf 0:2f61a610595e 2 * Copyright (c) 2009 rmeyer
rolf 0:2f61a610595e 3 * Released under the MIT License: http://mbed.org/license/mit
rolf 0:2f61a610595e 4 */
rolf 0:2f61a610595e 5
rolf 0:2f61a610595e 6 /* Function: hexview
rolf 0:2f61a610595e 7 * Prints an array of char to stdout in hex.
rolf 0:2f61a610595e 8 * The data is grouped in two 8 byte groups per line.
rolf 0:2f61a610595e 9 * Each byte is displayed as 2 hex digits and every
rolf 0:2f61a610595e 10 * line starts with the address of the first byte.
rolf 0:2f61a610595e 11 *
rolf 0:2f61a610595e 12 * There is no text view of a line.
rolf 0:2f61a610595e 13 *
rolf 0:2f61a610595e 14 * Variables:
rolf 0:2f61a610595e 15 * buffer - The array to display.
rolf 0:2f61a610595e 16 * size - The length of buffer.
rolf 0:2f61a610595e 17 */
rolf 0:2f61a610595e 18 inline void hexview(const char *buffer, unsigned int size) {
rolf 0:2f61a610595e 19 for(int i = 0; i < size; ++i) {
rolf 0:2f61a610595e 20 if((i%16)!=0) {
rolf 0:2f61a610595e 21 printf(" ");
rolf 0:2f61a610595e 22 } else {
rolf 0:2f61a610595e 23 printf("%04X: ", (i));
rolf 0:2f61a610595e 24 }
rolf 0:2f61a610595e 25 printf("%02hhx", buffer[i]);
rolf 0:2f61a610595e 26 if((i%16) == 7) {
rolf 0:2f61a610595e 27 printf(" ");
rolf 0:2f61a610595e 28 }
rolf 0:2f61a610595e 29 if((i%16) == 15) {
rolf 0:2f61a610595e 30 printf("\n");
rolf 0:2f61a610595e 31 }
rolf 0:2f61a610595e 32 }
rolf 0:2f61a610595e 33 printf("\n\n\n");
rolf 0:2f61a610595e 34 }
rolf 0:2f61a610595e 35
rolf 0:2f61a610595e 36 /* Function: hexview
rolf 0:2f61a610595e 37 * Prints an array of char to stdout in hex.
rolf 0:2f61a610595e 38 * The data is grouped in two 8 byte groups per line.
rolf 0:2f61a610595e 39 * Each byte is displayed as 2 hex digits and every
rolf 0:2f61a610595e 40 * line starts with the address of the first byte.
rolf 0:2f61a610595e 41 * Each line ends ub with an ASCII representation
rolf 0:2f61a610595e 42 * of the bytes.
rolf 0:2f61a610595e 43 *
rolf 0:2f61a610595e 44 * This implementation takes more stack space than the other.
rolf 0:2f61a610595e 45 * It will allocate two char arrays with a agregated size of 70 bytes.
rolf 0:2f61a610595e 46 * Therefore its faster than the fierst implementation.
rolf 0:2f61a610595e 47 * It operates directly on the char arrays and make no use of
rolf 0:2f61a610595e 48 * string manipulation functions. printf is called one time a line.
rolf 0:2f61a610595e 49 *
rolf 0:2f61a610595e 50 * Variables:
rolf 0:2f61a610595e 51 * buffer - The array to display.
rolf 0:2f61a610595e 52 * size - The length of buffer.
rolf 0:2f61a610595e 53 */
rolf 0:2f61a610595e 54 inline void hexview2(const char *buffer, unsigned int size) {
rolf 0:2f61a610595e 55 char byte[50];
rolf 0:2f61a610595e 56 char text[20];
rolf 0:2f61a610595e 57 bool big = false;
rolf 0:2f61a610595e 58 int i;
rolf 0:2f61a610595e 59 for(i = 0; i < size; ++i) {
rolf 0:2f61a610595e 60 if((i&0xF) == 0x0) {
rolf 0:2f61a610595e 61 if(big)
rolf 0:2f61a610595e 62 printf("%04X: %-49s: %-20s\n", (i&~0xF), byte, text);
rolf 0:2f61a610595e 63 big = false;
rolf 0:2f61a610595e 64 byte[0] = '\0';
rolf 0:2f61a610595e 65 text[0] = '\0';
rolf 0:2f61a610595e 66 } else if((i&0xF) == 0x8) {
rolf 0:2f61a610595e 67 big = true;
rolf 0:2f61a610595e 68 byte[(i&0xF) * 3] = ' ';
rolf 0:2f61a610595e 69 text[(i&0xF)] = ' ';
rolf 0:2f61a610595e 70 }
rolf 0:2f61a610595e 71 unsigned char value = buffer[i];
rolf 0:2f61a610595e 72 text[(i&0xF) + 0 + big] = (value < 0x20 || value > 0x7F)? '.': value;
rolf 0:2f61a610595e 73 text[(i&0xF) + 1 + big] = '\0';
rolf 0:2f61a610595e 74 value = (buffer[i] &0xF0) >> 4;
rolf 0:2f61a610595e 75 byte[(i&0xF) * 3 + 0 + big] = (value < 0xA)? (value + 0x30): (value + 0x37);
rolf 0:2f61a610595e 76 value = (buffer[i] &0x0F);
rolf 0:2f61a610595e 77 byte[(i&0xF) * 3 + 1 + big] = (value < 0xA)? (value + 0x30): (value + 0x37);
rolf 0:2f61a610595e 78 byte[(i&0xF) * 3 + 2 + big] = ' ';
rolf 0:2f61a610595e 79 byte[(i&0xF) * 3 + 3 + big] = '\0';
rolf 0:2f61a610595e 80 }
rolf 0:2f61a610595e 81 if(byte[0]) {
rolf 0:2f61a610595e 82 printf("%04X: %-49s: %-20s\n", (i&~0xF), byte, text);
rolf 0:2f61a610595e 83 }
rolf 0:2f61a610595e 84 printf("\n");
rolf 0:2f61a610595e 85 }