리틀엔디안에 관계된 문제로 사료됩니다.. 하지만 이해가 안됩니다..
리틀엔디안 : 바이트열의 작은 쪽이 앞에 저장
빅엔디안 : 바이트열의 큰 쪽이 앞에 저장
하지만 비트 스트림은 빅엔디안 유지.
그래서 4F20 이
빅엔디안으로 들어가면 4F20 고대로 리틀엔디안으로 들어가면 204F 로 들어감.
=======
제가 알고 있는 빅 엔디안과 리틀엔디안에 대한 지식은 여기 까지 입니다.
그럼 4F203E 가 있을 경우
빅엔디안: 4F203E
리틀엔디안: 3E204F
이 맞습니까?
그리고 뭔가를 만들다가 생긴 현상이 왠지 또 이놈의 엔디안 순서와 관련된것 같아서요..
인텔 머신입니다. (리틀엔디안이죠..)
에서, C 로 만든 프로그램입니다.
char 형 배열에 1byte 씩 일련의 값을 순서대로 써 넣었습니다.
즉
unsigned char a[1000] = {0};
이라고 했을때
a[0] =0x17;
a[1] =0x20;
a[2] =0x27;
a[3] =0x4B;
a[4] =0x10;
a[5] =0x30;
:
:
뭐 이런식으로 아주 많이 들어갑니다.
이걸 프로그램상에서 for (i=0; i < a의 길이;i++) print a[i]; 로 찍으면
17 20 27 4B 10 30 (출력결과는 16진수로 나온다고 할때)
로 잘 나옵니다.
하지만 a 배열 자체를 fwrite 등으로 파일에 쓰고 나서, 해당 파일을 od 나 hexdump 등으로 덤프하면
2017 4b27 3010
이렇게 2바이트씩 짝을 이뤄 바이트 순서가 바뀌어 나옵니다.
메모리에 쓰는것 자체를 1바이트 단위로 했는데 어찌 하여 2바이트씩 짝을 이뤄 앞뒤가 바뀌어 나오는 걸까요?
분명 리틀엔디안때문인것 같긴한데.. 왜 2바이트씩 묶어서 저리 나오는지는 모르겠습니다.
차라리 4바이트 단위로 저렇게 나와 버리면 32비트 머신이라 그런가? 뭐 이런 얼토당토 않은 추측이라도 해보겠으나...
혹은 엔디안 문제가 아닌건가요?
아.. 궁금합니다...
고수 분들의 많은 가르침 부탁 드립니다.
우선, 0x004F203E 를 32bit
우선, 0x004F203E 를 32bit 자료라고 가정한다면
3E204F00 이 됩니다.
0x01이 16bit라면 0x0100이지만 32bit라면 0x01000000 인거죠.
그리고 두번째의 경우, hexdump나 od가 2byte씩 보여주면서 자동으로 endian변환을 하게 됩니다.
그걸 byte array라고 보지 않고, 2byte int 씩 끊어서 보여주는거죠.
hexdump -C 옵션을 사용해보면 정상적으로 나타나는것을 알 수 있습니다.
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
댓글 달기