isendrak

hexdump.cpp

Apr 20th, 2014
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <sys/stat.h>
  4. #include <unistd.h>
  5.  
  6. #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
  7.     #include <io.h>
  8.     #include <stdio.h>
  9.     #include <fcntl.h>
  10. #endif
  11.  
  12. using namespace std;
  13.  
  14. typedef unsigned char byte;
  15.  
  16. void dump_stream(istream& reader, int width=16){
  17.     byte b;
  18.     byte c[width+1];
  19.     for(int i=0;i<width+1;i++){c[i]='\x0';}
  20.     int col=0;
  21.     int offset=0;
  22.     printf("        |");
  23.     for(int i=0;i<width;i++){
  24.         printf("%02X ",i);
  25.     }
  26.     printf("\n--------+");
  27.     for(int i=0;i<width;i++){
  28.         printf("---");
  29.     }
  30.     printf("\n");
  31.     printf("%08X|",offset);
  32.     while(!reader.eof()){
  33.         b=reader.get();
  34.         printf("%02X ",b);
  35.         if(b>=32 && b<=127){c[col]=b;}
  36.         else{c[col]='.';}
  37.         col++;
  38.         if(col>width-1){
  39.             offset+=width;
  40.             printf("|%s|\n%08X|",c,offset);
  41.             col=0;
  42.         }
  43.     }
  44.     while(col<width){
  45.         printf("   ");
  46.         c[col]='\x0';
  47.         col++;
  48.     }
  49.     offset+=width;
  50.     printf("|%s|\n%08X|\n",c,offset);
  51. }
  52.  
  53. bool exists(const char *name){
  54.     struct stat buf;
  55.     if(stat(name,&buf)!=-1){return true;}
  56.     return false;
  57. }
  58.  
  59. int pow(int x,int y){
  60.     if(y==0){return 1;}
  61.     int r=x;
  62.     for(int i=0;i<y-1;i++){
  63.         r*=x;
  64.     }
  65.     return r;
  66. }
  67.  
  68. int parseInt(char* text){
  69.     int len=strlen(text);
  70.     int t=0;
  71.     int r=0;
  72.     for(int i=len-1;i>-1;i--){
  73.         r+=((int)text[i]-48)*pow(10,t);
  74.         t++;
  75.     }
  76.     return r;
  77. }
  78.  
  79. int main(int argc, char *argv[]){
  80.     int opt=0;
  81.     int argn=0;
  82.     int width=16;
  83.     while((opt=getopt(argc, argv, "hw:"))!=-1){
  84.         argn++;
  85.         switch(opt){
  86.             case 'h':
  87.                 printf("usage: %s [options] <filename/s>\n",argv[0]);
  88.                 printf("If <filename/s> is omitted, stdin is used.\n");
  89.                 printf("Options:\n");
  90.                 printf("-h     Shows this text.\n");
  91.                 printf("-w<N>  Sets the dump's width to N bytes.\n");
  92.                 return 0;
  93.             case 'w':
  94.                 width=parseInt(optarg);
  95.                 break;
  96.         }
  97.     }
  98.     if(argc>=2+argn){
  99.         for(int i=1;i<argc-argn;i++){
  100.             char *fname=argv[argn+i];
  101.             if(!exists(fname)){
  102.                 printf("File \"%s\" not found.\n",fname);
  103.                 return 1;
  104.             }
  105.             ifstream reader;
  106.             reader.open(fname,ios_base::binary);
  107.             dump_stream(reader,width);
  108.             reader.close();
  109.         }
  110.     }
  111.     else{
  112.         #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
  113.             _setmode(_fileno(stdin), _O_BINARY);
  114.             dump_stream(cin,width);
  115.         #else
  116.             ifstream reader;
  117.             reader.open("/dev/stdin",ios_base::binary);
  118.             dump_stream(reader,width);
  119.             reader.close();
  120.         #endif
  121.     }
  122.     return 0;
  123. }
Add Comment
Please, Sign In to add comment