App Programming/Network Programming
endian (데이터저장 방식)
BAGE
2006. 8. 9. 20:54
이것은 보통 CPU에 따른 memory access order와 관련한 endian 문제라고 합니다.
intel계열은 보통 littlen endian이라고 불리우는 방식으로,
그리고 많은 unix workstation이 사용하는 risc 나 motorolla등은 big endian이라고 불리우는 방식으로 memory를 접근합니다.
심지어 예전 DEC에서 만든 alpha chip경우에는 설정에 따라 littlen endian으로도 big endian으로 사용이 가능했습니다.
그리고 network programming시 network order라고 하면 bigendian과 같은 말입니다.
코드를 예로 들면
print ()
{
unsigned int* p; // sizeof (unsigned int) == 4라고 가정.
unsigned char zb[4] = {0x01, 0x02, 0x03, 0x04};
assert (sizeof (unsigned int) == 4);
if ( (*(unsigned int*)zb) == 0x01020304)
{
printf ("big-endiann");
}
else
{
printf ("little-endiann");
}
}
위의 print함수를 수행하면 littlen endian경우에는 "littlen-endian"이라고 찍겠지요..
littlen endian과 big endian간의 바이너리 데이타 변환은 16비트또는 32비트단위로 저장시 사용된 데이타 타입에따라
(unsigned short, unsigned int등등) 이루어지게 됩니다.
unsigned short
swapUnsignedShort (unsigned short a)
{
unsigned short b;
assert (sizeof (unsigned short) == 2);
b = (unsigned short)( ((a >> 8) & 0x00FF) | ((a > 24) & 0x000000FF) |
((a >> 8) & 0x0000FF00) |
((a 49과 같다.
위 순서는 byte hex format으로 메모리를 들여다 본 것내용이고
short hex format으로 들여다 본다면
3131 3232 3333 3434 3535 3636 3737 3838 형태가 될것이다.
실제 두개의 수가 같어서 그렇지 실제로는 서로 순서가 뒤바뀐 것이다.
마찬가지로 long hex format으로 보면
32323131 34343333 36363535 38383737와 같이 된다.
이 상황에서 K_BLOCK은 다음과 같은 형태의 메모리 구조를 띈다.
L32(4byte) U32(4byte) L32(4byte) U32(byte)
이는 다음과 같이 매칭된다.
L32(4byte) U32(4byte) L32(4byte) U32(byte)
32323131 34343333 36363535 38383737 long hex format(4byte)
842150193 875836211 909522229 943208247 10진 값.
intel계열은 보통 littlen endian이라고 불리우는 방식으로,
그리고 많은 unix workstation이 사용하는 risc 나 motorolla등은 big endian이라고 불리우는 방식으로 memory를 접근합니다.
심지어 예전 DEC에서 만든 alpha chip경우에는 설정에 따라 littlen endian으로도 big endian으로 사용이 가능했습니다.
그리고 network programming시 network order라고 하면 bigendian과 같은 말입니다.
코드를 예로 들면
print ()
{
unsigned int* p; // sizeof (unsigned int) == 4라고 가정.
unsigned char zb[4] = {0x01, 0x02, 0x03, 0x04};
assert (sizeof (unsigned int) == 4);
if ( (*(unsigned int*)zb) == 0x01020304)
{
printf ("big-endiann");
}
else
{
printf ("little-endiann");
}
}
위의 print함수를 수행하면 littlen endian경우에는 "littlen-endian"이라고 찍겠지요..
littlen endian과 big endian간의 바이너리 데이타 변환은 16비트또는 32비트단위로 저장시 사용된 데이타 타입에따라
(unsigned short, unsigned int등등) 이루어지게 됩니다.
unsigned short
swapUnsignedShort (unsigned short a)
{
unsigned short b;
assert (sizeof (unsigned short) == 2);
b = (unsigned short)( ((a >> 8) & 0x00FF) | ((a > 24) & 0x000000FF) |
((a >> 8) & 0x0000FF00) |
((a 49과 같다.
위 순서는 byte hex format으로 메모리를 들여다 본 것내용이고
short hex format으로 들여다 본다면
3131 3232 3333 3434 3535 3636 3737 3838 형태가 될것이다.
실제 두개의 수가 같어서 그렇지 실제로는 서로 순서가 뒤바뀐 것이다.
마찬가지로 long hex format으로 보면
32323131 34343333 36363535 38383737와 같이 된다.
이 상황에서 K_BLOCK은 다음과 같은 형태의 메모리 구조를 띈다.
L32(4byte) U32(4byte) L32(4byte) U32(byte)
이는 다음과 같이 매칭된다.
L32(4byte) U32(4byte) L32(4byte) U32(byte)
32323131 34343333 36363535 38383737 long hex format(4byte)
842150193 875836211 909522229 943208247 10진 값.