[완료]Big Endian 방식의 data인식을 Little Endian 방식으로 인식하게 하는법 관련
#설명#
example라는 512바이트의 binary data를 읽어 들여와서 buf1과 buf2에 저장 합니다.
example의 HEX data를 먼저 출려하고 그중 특정부위(buf1기준 56번 배열부터 59번까지)
(buf2기준 14번 배열)의 data를(총32bit)를 DEC 로 출력 하는 프로그램 입니다.
#질문#
이 프로그램은 보시다시피 Big Endian 방식으로 HEX를 읽어 들여와 DEC으로 출력을 합니다.
저는 Little Endian 방식으로 HEX를 읽어 DEX로 표현 하고 싶습니다.
예를들면, 0x00001000 은 4096이 아닌 1048576으로 출력되게 말입니다.
제가 예상하는 방법은 아래 2가지 입니다.
1.buf1의 값을 이용하는 방법
buf1[56], buf1[57], buf1[58], buf1[59] 의 char 데이터를 역순으로 32bit 크기의
변수에 알맞게 할당 그 변수를 decimal로 표현 하는 방법
(문제: buf2처럼 32bit에 값이 전부 들어가게 하는 방법)
2.buf2의 값을 이용하는 방법
buf2의 값을 long type의 변수로 type전환, 전환된 변수를 순환shift 시켜서 값을 조정 출력
(문제: C의 shift연산자(<<)는 순환 시프트가 아니다)
3.함수가 있다?
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> union unspan { long ulong; unsigned char uchar[4]; } trans; int main() { int fd1, fd2, nread1, nread2; unsigned short int count; unsigned char buf1[512]; char* buf2[128]; if((fd1 = open("example", O_RDONLY)) == -1) { perror("Cannot open the file"); exit(-1); } if((fd2 = open("example", O_RDONLY)) == -1) { perror("Cannot open the file"); exit(-1); } if((nread1 = read(fd1, buf1, 512)) < 512) { perror("Not enough header data"); exit(-1); } if((nread2 = read(fd2, buf2, 128)) < 128) { perror("Not enough header data"); exit(-1); } for(count=0; count < nread1; count++) { printf("%02X ", buf1[count]); } puts("\n\n[Minimum Size(ver.512)]"); trans.ulong = (long)buf2[14]; for(count=0; count < 4; count++) { printf("%02X ", trans.uchar[count]); } printf("\t(This value is %d)\n", trans.ulong); puts("\n\n[Minimum Size(ver.128)]"); for(count=0; count < 4; count++) printf("%02X ", buf1[count+56]); printf("\t(This value is %d)\n", buf2[14]); }
아래는 출력 값입니다
D0 CF 11 E0 A1 B1 1A E1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 03 00 FE FF 09 00 06 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 0C 00 00 00 02 00 00 00 00 00 10 00 0F 00 00 00 01 00 00 00 FE FF FF FF 00 00 00 00 0D 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[Minimum Size(ver.512)]
00 00 10 00 (This value is 4096)
[Minimum Size(ver.128)]
00 00 10 00 (This value is 4096)
3. htons, htonl, ntons, ntonl
3. htons, htonl, ntons, ntonl
답변 감사합니다
위 함수들은 cpu architecture에 의존적인 부분이 있더군요.
예를 들어,
sparc은 Host byte order도 Big Endian
Network byte order도 Big Endian이여서
한수를 사용해도 그 순서가 역순으로 바뀌지 않습니다.
단순히 Byte Order를 바꿔주는 함수는 없는지 궁굼합니다ㅎ.
댓글 달기