2008년 11월 18일 화요일

JAVA 와 C 간의 TCP 통신시 Endian 처리


두 다른 언어를 TCP 로 연결할때 플랫폼이 다르다면 시스템이 little-Endian / Big-Endian 인지 확인하여야한다.
일반적으로 Linux 은 little-Endian Windows 는 Big-Endian 을 사용한다. ( 시스템 마다 차이 있을수 있음 )

Server ( Linux C )
Client (windows JAVA) 일경우에는 ..

C 에서 받은 버퍼를 받아 Endian 처리를 다음과 같이 변환하여야한다. (int 자료형 등을 받을때)

/**
   * Java는 모든 플렛폼에서 정수를 표현할 때 Big-Endian 방식을 사용한다.

   * Little-Endian을 사용하는 플렛폼에서 보낸 이진데이터를 받을 경우
     Big-Endian으로 변환하여 사용해야한다.

   * 다음은 자바에서 Big Little Endian변환을 수행하는 로직이다.
   */

public class Endian{
  /**
   * 자바에서 사용하는 Big-Endian 정수값을 Little-Endian 바이트 배열로 변환한다.
   */

  public static byte[] getLittleEndian(int v){
       byte[] buf = new byte[4];
       buf[3] = (byte)((v >>> 24) & 0xFF);
       buf[2] = (byte)((v >>> 16) & 0xFF);
       buf[1] = (byte)((v >>>  8) & 0xFF);
       buf[0] = (byte)((v >>>  0) & 0xFF);
       return buf;
  }
 
  /**
   * Little-Endian 바이트 배열을 자바에서 사용하는 Big-Endian정수로 변환한다.
   */
  public static int getBigEndian(byte[] v)throws Exception{
       int[] arr = new int[4];
       for(int i=0;i<4;i++){
            arr[i] = (int)(v[3-i] & 0xFF);
       }
       return ((arr[0]  << 24) + (arr[1]  << 16) + (arr[2]  << 8) + (arr[3]  << 0));
   }
}


C <--> JAVA 통신 설정시 잘못된 값이 나올수 있기 때문에, 이유 정도는 알아둘 필요가 있다.
이것이 구찮다면 전부 byte 로 보내자 ..;;

소스출처: http://blog.naver.com/joodong1027?Redirect=Log&logNo=130023035042 

댓글 없음:

댓글 쓰기