2010년/5월

5월28일(비트맵뷰어회전)C++(hexaviewer c++로 변환

뽀얀햄스터 2010. 5. 28. 08:45


P587;
=========================================================================
=========================================================================

C++
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <iostream>
#include <io.h>
using namespace std;
#define MAX_FILE_SIZE 1400

void HesaView(void *vp,int iSize)
{
  int iCnt;
  int iHexnum=0;
  cout.setf(ios::uppercase); //대문자로 출력
  if(0==vp)
  {
    return;
  }
  if(MAX_FILE_SIZE<iSize)
  {
    iSize=MAX_FILE_SIZE;
  }
  cout<<" _ADDRESS_ ";
  
  for(iCnt = 0;16 > iCnt ; ++iCnt)
  {
    cout.width(3);
    cout<<hex<<iCnt;
  
  }
  cout.width(3);
  for(iCnt = 0;16 > iCnt ; ++iCnt)
  {
    
    cout<<hex<<iCnt;
  
  }
  cout<<endl;

  for(iCnt = 0136>iCnt ; ++iCnt)
  {
    cout<<"-";

  }
  cout<<endl;

  while(iHexnum<1400)
  {
    iCnt = iHexnum;
    cout<<"0x";
    cout.width(8);
    cout.fill('0');
    cout<<iCnt;
    //"0x%08x "
    cout.fill(' ');
    cout<<"  ";
    while(iHexnum+16>iCnt)
    {
      cout.width(2);
      cout.fill('0');
      int a=*(((unsigned char*)vp)+iCnt);
      cout<<a<<" ";
      

      iCnt++;
    }
    cout.fill(' ');
    cout.width(2);

    for(iCnt = iCnt - 16;(iHexnum+16)>iCnt; ++iCnt)
    {
      if(
        ( 32 >=  (*(((unsigned char*)vp) + iCnt))) ||
        ( 127 <=  (*(((unsigned char*)vp) + iCnt)))  )
      {
        
        cout<<".";

      }
      else
      {
        
        cout<<*(((unsigned char*)vp)+iCnt);

      }
    }
    cout<<endl;

    iHexnum+= 16;
  }
}

int main(int iArg,char *capArg[])
{
  int       iFileDS;
  int       iRet;
  unsigned char   *ucpData=0;
  struct stat   stFileInfo;

  if(2 != iArg)
  {
    cout<<"잘못입력하셨습니다.."<<endl;

    return 0;
  }

  iFileDS=open(capArg[1],O_RDONLY|O_BINARY);
  
  if(0 >iFileDS)
  {
    cout<<"파일을 찾을 수 없읍니다."<<endl;

    return 0;
  }

  iRet=fstat(iFileDS,&stFileInfo);
  if(0>iRet)
  {
    cout<<"파일 정보를 읽어 들일 수 없읍니다"<<endl;    

    close(iFileDS);
    return 0;
  }
  else
  {
    iRet=stFileInfo.st_size;
  }
  if(MAX_FILE_SIZE<iRet)
  {
    iRet=MAX_FILE_SIZE;
  }

  ucpData=(unsigned char*)malloc(iRet);
  if(0==ucpData)
  {
    cout<<"메모리 공간이 부족합니다..\n";
    close(iFileDS);
    return 0;
  }

  iRet=read(iFileDS,ucpData,iRet);
  close(iFileDS);

  if(0>iRet)
  {
    cout<<"파일을 읽을 수 없읍니다.\n";
    close(iFileDS);
    free(ucpData);
    return 0;
  }
   HesaView(ucpData,iRet);
  free(ucpData);
  close(iFileDS);
  return 0;
}