Search

'바이트'에 해당되는 글 1건

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

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

Projects/CoVNC 2007.01.23 13:44 Posted by soulfree >동네청년<

자바 기본 유형의 바이트 순서 변환
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]+")");

       }

}


신고