00001 #include "io.h" 00002 #include <ctype.h> 00003 #include <stdlib.h> 00004 #include "utils.h" 00005 00006 char MakeHex(char v) 00007 { 00008 if(v > 9) 00009 v += 'A' - 10; 00010 else 00011 v += '0'; 00012 return v; 00013 } 00014 00015 int CharToHex(char v,char *s,char c) 00016 { 00017 int i = 0; 00018 00019 s[i++] = MakeHex((v >> 4) & 0x0f); 00020 s[i++] = MakeHex(v & 0x0f); 00021 if(c) 00022 s[i++] = c; 00023 return i; 00024 } 00025 00026 int UnsignedToHex(unsigned v,char *s,char c) 00027 { 00028 char *t = (char *)&v; 00029 int i = 0; 00030 00031 ++t; 00032 i += CharToHex(*t--,&s[i],0); 00033 i += CharToHex(*t,&s[i],c); 00034 return i; 00035 } 00036 00037 void HexDump(int fd,char *b,int n) 00038 { 00039 char *s = malloc(128); 00040 int i,j,l; 00041 unsigned adr; 00042 00043 adr = (unsigned)b; 00044 00045 for(j=0;j<n;j+=8) 00046 { 00047 l = 0; 00048 l += UnsignedToHex(adr,&s[l],' '); 00049 for(i=0;i<8;++i) 00050 { 00051 l += CharToHex(b[i+j],&s[l],(i==7)?' ':'-'); 00052 } 00053 for(i=0;i<8;++i) 00054 { 00055 if(isprint(b[i+j])) 00056 s[l++] = b[i+j]; 00057 else 00058 s[l++] = '.'; 00059 } 00060 s[l++] = '\r'; 00061 s[l++] = '\n'; 00062 _write(fd,s,l); 00063 adr += 8; 00064 } 00065 free(s); 00066 }