개발 관련/Java
[JAVA] int 또는 float 를 byte 배열 타입으로 변환. byte 배열을 int 또는 float 으로 변환, Unsigned 표현.
snoworca
2014. 3. 4. 16:22
자주쓰는 함수라 매번 코딩하기 귀찮아서 올려 놓는다.
아래는 4개의 길이를 갖는 byte 배열을 int 로 바꾸거나 int 를 4개의 길이를 갖는 byte 배열로 바꾸는 것이다.
그밖에 unsigned 를 지원하지 않는 자바에서 int 데이터를 unsinged 표현 값으로 바꾸기.// 아래의 방법 외에 다음과 같이 간단한 방법도 존재한다. :
// 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 주소를 포인터 캐스팅 하는 방법으로 아주 쉽게 바꿀 수 있는데, 환경에 따라서 불가능할수도 있다. 그럴 경우에는 아주 조금 번거롭게 변경해야 한다. 이 부분에 대하여 다음에 다뤄보겠다.
public long toUnsigned(int value) { return ((long)value & 0xFFFFFFFFL); }