파일에서 이진데이터 8바이트만 읽어오고싶은데..잘안되네요
글쓴이: his2000x / 작성시간: 화, 2011/10/18 - 7:31오후
복합 문서 형식을 파싱해보려구 하는데요
한글파일도 복합문서 형식이라서 한글파일로
파일시작의 8바이트만 읽어오려고 합니다.
제가 코딩한소스는
typedef struct Header { int identifier[8]; }TESTHeader; if ( (fp = fopen("/home/test/2010.hwp","rb")) == NULL ) { printf("cannot open file\n"); fclose(fp); } fread(&testHeader,sizeof(TESTHeader),1,fp);
이렇게 인데
복합문서의 헤더는 파일 제일 처음 시작이 d0 cf 11 e0 a1 b1 1a e1 이 온다구 문서에 써있어요
그래서 int identifier[8];로 선언하구 읽으면
identifier[0]에 e011cfd0 가 저장됩니다.
리틀엔디언이라서 거꾸로 저장된거맞죠??
그래서 char identifier[8]로 선언을 바꾸고 읽어봤습니다.
그러면 8바이트가 배열 8개에 나눠져서 들어오긴하는데
printf("%x\n",testHeader.identifier[0]); printf("%x\n",testHeader.identifier[1]);
로 출력해보면
identifier[0] 은 ffffffd0
identifier[1] 은 ffffffcf
라고 나오네요.
왜 앞에 ffffff가 붙는건지 , 그리고 배열에 d0,cf 등만 저장되게 하려면 어떻게 읽어야하는지
감이 안잡히네요
힌트 주시면 감사히 배우겠습니다...
한수부탁드립니다..
Forums:
identifier[0] & 0xff이런 식으로?
이런 식으로 bitwise and 를 써 보시면 될 것 같습니다.
세벌 https://sebuls.blogspot.kr/
char는 제일 앞 bit가 부호비트이기 때문에
char는 제일 앞 bit가 부호비트이기 때문에 -128 ~ 127까지 박에 표시못합니다.
char를 BYTE로 바꾸어서 BYTE identifier[8]로 선언해야 하고요.
printf("%x\n",testHeader.identifier[0]); 이것은 printf("%02x\n",testHeader.identifier[0] ); 로 바꾸면 될 것 같네요.
윈도우에서 해봤습니다.
unsigned char 로 하니 ffff가 사라집니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
음 ..
%x 는 unsigned int 를 unsigned hexadecimal 로 출력하는 지시자입니다.
char 0xd0 를 unsigned int 로 assign 하면 0xffffffd0 가 됩니다.
출력할 때 char 변수를 (unsigned char) 로 캐스팅 하거나, %2x 처럼 precision 을 지정해주면 됩니다.
아니면, 변수를 그냥 unsigned char 로 선언해도 됩니다.
char 가 아닌 binary data 를 처리하는 경우에는, unsigned 로 처리하는것이 좋습니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
감사합니다
감사합니다~
많이 배워갑니다~!!
댓글 달기