2019년 12월 26일 목요일

[Unity] int또는 float를 byte 배열 타입으로 변환,byte배열을 int또는 float으로 변환

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


출처: https://dev.re.kr/24 [Dev.re.kr]

댓글 없음:

댓글 쓰기

git rejected error(feat. cherry-pick)

 문제 아무 생각 없이 pull을 받지않고 로컬에서 작업! 커밋, 푸시 진행을 해버렷다. push에선 remote와 다르니 당연히 pull을 진행해라고 하지만 로컬에서 작업한 내용을 백업하지 않고 진행하기에는 부담스럽다(로컬작업 유실 가능성) 해결하려...