자주쓰는 함수라 매번 코딩하기 귀찮아서 올려 놓는다. 


  아래는 4개의 길이를 갖는 byte 배열을 int 로 바꾸거나 int 를 4개의 길이를 갖는 byte 배열로 바꾸는 것이다.

// 아래의 방법 외에 다음과 같이 간단한 방법도 존재한다.  :
//   byte[] byteArray = ByteBuffer.allocate(4).putInt(value).array();
public  byte[] intToByteArray(int value) {
		byte[] byteArray = new byte[4];
		byteArray[0] = (byte)(value >> 24);
		byteArray[1] = (byte)(value >> 16);
		byteArray[2] = (byte)(value >> 8);
		byteArray[3] = (byte)(value);
		return byteArray;
	}
	
public  int byteArrayToInt(byte bytes[]) {
	return ((((int)bytes[0] & 0xff) << 24) |
			(((int)bytes[1] & 0xff) << 16) |
			(((int)bytes[2] & 0xff) << 8) |
			(((int)bytes[3] & 0xff)));
} 

  이 코드는 자바 기준으로 작성되어 있어 big endian 방식으로 되어있는데, x86 계열에서 컴파일되는 C 에서는 little endian 방식으로 바꿔야한다.  예를들어 위 코드에서 배열 인덱스 순서만 0,1,2,3 에서 3,2,1,0 순으로 바꿔주기만 하면 된다. 아래와 같이 말이다. 

byteArray[3] = (byte)(value >> 24);

byteArray[2] = (byte)(value >> 16);

byteArray[1] = (byte)(value >> 8); 

byteArray[0] = (byte)(value); 


이제 위에 예제를 이용하여 Byte Array to Float, Float to Byte Array 로 변환하는 함수를 만들어 보겠

다.

public byte[] floatToByteArray(float value) {
	int floatValue =  Float.floatToIntBits(value);
	return intToByteArray(floatValue);
}

public float byteArrayToFloat(byte bytes[]) {
	int value =  byteArrayToInt(bytes);
	return Float.intBitsToFloat(value);
}

역시 JAVA 가 여러모로 편하다.

C/C++ 에서는 float -> int 주소를 포인터 캐스팅 하는 방법으로 아주 쉽게 바꿀 수 있는데, 환경에 따라서 불가능할수도 있다.  그럴 경우에는 아주 조금 번거롭게 변경해야 한다. 이 부분에 대하여 다음에 다뤄보겠다.


그밖에 unsigned 를 지원하지 않는 자바에서 int 데이터를 unsinged 표현 값으로 바꾸기.
	public long toUnsigned(int value) {
		return ((long)value & 0xFFFFFFFFL);
	}


Posted by 범 범2

댓글을 달아 주세요