반응형



출처 : http://sea1sun.egloos.com/8879051



이 두 용어는 여러 바이트로 이루어진 하나의 데이터를 메모리에 저장하는 순서를 나타낸다.

메모리에 저장된 바이트들의 순서
예 : 0x013F (십진수 : 319)
빅엔디언에서의 메모리 로드 (sun/모토롤라 MP 계열 CPU)
0000 0001 0011 1111
^ ^
| |
1000번지 1001번지 (저장되는 메모리 번지) 0x01 0x3F
(unsigned int i = 8; 이라고 했다면 unsigned int가 4바이트)
(00000000 00000000 00000000 00001000)
리틀엔디언에서 메모리 로드 (인텔 호환 기반의 cpu)
0011 1111 0000 0001
^ ^
| |
1000번지 1001번지 (저장되는 메모리 번지) 0x3F 0x01
(unsigned int i = 8; 이라고 했다면 unsigned int가 4바이트)
(00001000 00000000 00000000 00000000)
=> 리틀엔디언이라도 한 바이트 내에서는 빅엔디언으로 정렬
* 데이터 통신에서는 비트 순서를 둘 중 어느 한 방식으로 하는 것이 가능하다.
따라서 주는 쪽과 받는 쪽이 이를 확인하고 데이터 처리해야 함.

* 조나단 스위프트의 걸리버 여행기에 나오는 소인국 사람들(Lilliputian)은
삶은 달걀을 넓은 면을 깨서 먹는 사람들(Big Endian)과 좁은 면을 깨서
먹는 사람들(Little Endian)로 나뉘어 정치적인 대립하게 된다.
컴퓨터 구조상에서 쓰이는 “빅 엔디언(Big Endian)”과
“리틀 엔디언(Little Endian)” 은 바로 여기서 유래되었다.

자바 기본 유형의 바이트 순서 변환

author : Yoon Kyung Koo(yoonforh@moon.daewoo.co.kr)
Copyright (c) 1999 Yoon Kyung Koo, All rights reserved.
LITTLE ENDIAN은 LSB가 처음에 나오고
BIG ENDIAN은 MSB가 처음에 나옵니다.
그리고 네트웍 바이트 순서는 BIG ENDIAN입니다.
만약 4바이트 (즉, 자바의 int, 32비트 기계에서 C의 int나 long)라면
Little Endian에서 1234 순서로 바이트가 배치되면
자바나 Big Endian은 4321 순서로 바이트를 해석해야 합니다.

float나 double의 경우는 시스템에 따라 좀더 복잡합니다.
하지만 IEEE 754를 따르는 경우에는 단순히 바이트 순서만 바꾸면 해석 가능합니다.
C에서
float은 보통 32비트(4바이트)이고
double은 보통 64비트(8바이트)입니다.
자바도 이에 준할 것입니다.
따라서 리틀 엔디안에서 더블을 표현할 때
12345678 바이트 순서라면
빅 엔디안에서는
87654321 바이트 순서로 해석하면 됩니다.


다음은 간단하게 자바 int를 다른 엔디안 값으로 바꿔보는 것입니다.


// htonl.java

class htonl {

        public static void main(String args[]) {

                if (args.length<1) {

                        System.out.println("Usage:htonl number");

                        System.exit(0);

                }

                int value=Integer.parseInt(args[0]);

                // all java integer is BIG-ENDIAN(network byte-order)

                byte[] bytes=new byte[4];

                bytes[0]=(byte)((value&0xFF000000)>>24);

                bytes[1]=(byte)((value&0x00FF0000)>>16);

                bytes[2]=(byte)((value&0x0000FF00)>>8);

                bytes[3]=(byte) (value&0x000000FF);

                int newValue = 0;

                newValue |= (((int)bytes[3])<<24)&0xFF000000;

                newValue |= (((int)bytes[2])<<16)&0xFF0000;

                newValue |= (((int)bytes[1])<<8)&0xFF00;

                newValue |= (((int)bytes[0]))&0xFF;

                System.out.println("big endian value="+value+" ("+bytes[0]+","+bytes[1]+","+bytes[2]+","+bytes[3]+")");

                System.out.println("little endian value="+newValue+" ("+bytes[3]+","+bytes[2]+","+bytes[1]+","+bytes[0]+")");

        }

}


반응형

'Coding Tip > JAVA' 카테고리의 다른 글

jdk 설치 후 환경변수 설정  (0) 2013.01.03

+ Recent posts