Endian 변화에 따른 바이트 스왑


[ 다음 글들 ] [ 이어서 글올리기(답하기) ] [ 자바 묻고 답하기 ]

글쓴이 :윤경구 1998년 6월 25일 11:22:04

In Reply to: [질문] Big-endian? Little-endian??? posted by 전재완 on 1998년 6월 24일 14:06:29:

알다시피
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]+")");
}
}


예를 들어 655236255라는 정수는 다른 바이트 오더에 따르면
-16717821이라는 값이 됨을 확인할 수 있습니다.


다음 글들:



이어서 글올리기(답하기)

이름:
E-Mail:
제목:
내용:
관련 URL(선택):
URL 제목(선택):
관련 이미지 URL:


[ 다음 글들 ] [ 이어서 글올리기(답하기) ] [ 자바 묻고 답하기 ]