프로그램/C/C++/OOC

File Hexa Viewer : 저수준 파일 입출력 사용, C

와이즈캣 2010. 11. 10. 16:55

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

#define   LEN  16

int main(int iParam, char *cpParam[])
{  int     iCnt;
  int    iFile;
  unsigned char  ucBuf;
  unsigned char  ucaStr[LEN+1]="";

  if(2 != iParam)
  {  fprintf(stdout, "파일 이름을 쓰세요\n");
    return 0;
  }

  iFile = open(cpParam[1], O_RDONLY);
  if(0 > iFile)
  {  fprintf(stdout, "[%s]파일을 찾을 수 없습니다\n", cpParam[1]);
    return 0;
  }

  printf(  "┌────────┬───────────────────────────────────────────────┬────────────────┐\n");
  printf(  "│        │                  HEXA   CODE                  │  ASCII  CODE   │\n");
  printf(  "│  ADDR  ├───────────────────────────────────────────────┴────────────────┤\n");
  printf(  "│        │00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF│\n");
  printf(  "├────────┼────────────────────────────────────────────────────────────────┤\n");

  iCnt = 0;
  while(1 == read(iFile, &ucBuf, 1))
  {
    if(0 == (iCnt%LEN))
    {
      printf("│%08X│", iCnt/LEN);
    }
    printf("%02X ", ucBuf);


    if(31 >= ucBuf)
    {
      ucaStr[iCnt%LEN] = '.';
    }
    else if(127 < ucBuf)
    {
      ucaStr[iCnt%LEN] = '.';
    }
    else
    {
      ucaStr[iCnt%LEN] = ucBuf;
    }
    
    ++iCnt;
    if(0 == (iCnt%LEN))
    {
      printf("%s│\n", ucaStr);
    }
  }
  if(0 != (iCnt%LEN))
  {
    while(0 != (iCnt%LEN))
    {
      ucaStr[iCnt%LEN] = ' ';
      printf("   ");
      ++iCnt;
    }
    printf("%s│\n", ucaStr);
  }
  printf(  "└────────┴────────────────────────────────────────────────────────────────┘\n");

  close(iFile);
  return 0;
}