Rolf Meyer
/
ethersniff_hex
A simple example how to receive ethernet packages and display them over stdout with an hexviewer
hexview.h@0:2f61a610595e, 2009-12-09 (annotated)
- Committer:
- rolf
- Date:
- Wed Dec 09 11:36:29 2009 +0000
- Revision:
- 0:2f61a610595e
Who changed what in which revision?
User | Revision | Line number | New 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 | } |