두 다른 언어를 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
댓글 없음:
댓글 쓰기