안드로이드 플젝을 하다가 보니 ByteBuffer로 short이나 int 형을 byte[]로 변환하는데 내가 사용을 잘못한건지 가끔 제대로 변환이 안되고 그냥 이전에 변환된 배열을 리턴하는 경우를 발견했다.
초당 수백번씩 호출해서 그런건지 한참 삽질하다가 그 함수에 문제가 있는걸 확인하고 검색해서 비트 연산해서 직접 바꾸는 방식을 찾아서 약간 손봐서 정리해서 올림
LE는 Little Endian, BE는 Big Endian
1. short -> byte
public void shortToBytes_BE(short input, byte[] output, int offset ) { output[0+offset] = (byte) (input >> 8); output[1+offset] = (byte) input; } public void shortToBytes_LE(short input, byte[] output, int offset ) { output[0+offset] = (byte) input; output[1+offset] = (byte) (input >> 8); }
2. int -> byte
public void intToBytes_LE(int input, byte[] output , int offset ) { for(int cnt = 0; cnt<4; cnt++){ output[cnt+offset] = (byte) (input % (0xff + 1)); input = input >> 8; } } public void intToBytes_BE(int input, byte[] output , int offset ) { for(int cnt = 0; cnt<4; cnt++){ output[ (3-cnt) +offset] = (byte) (input % (0xff + 1)); input = input >> 8; } }
3. float -> byte
public void floatToBytes_LE(float input, byte[] output, int offset ) { int bits = Float.floatToIntBits(input); for(int i = 0; i < 4; i++) output[i+offset] = (byte)( (bits >> ( i * 8) ) & 0xff); } public void floatToBytes_BE(float input, byte[] output, int offset ) { int bits = Float.floatToIntBits(input); for(int i = 0; i < 4; i++) output[i+offset] = (byte)( (bits >> ( (3-i) * 8) ) & 0xff); }
4. long ->byte
public void longToBytes_LE(long input, byte[] output, int offset ) { for(int cnt = 0; cnt<8; cnt++){ output[cnt+offset] = (byte) (input % (0xff + 1)); input = input >> 8; } } public void longToBytes_BE(long input, byte[] output, int offset ) { for(int cnt = 0; cnt<8; cnt++){ output[ (7-cnt) +offset] = (byte) (input % (0xff + 1)); input = input >> 8; } }
5. double ->byte
public void doubleToBytes_LE(double input, byte[] output, int offset ) { long bits = Double.doubleToLongBits(input); for(int i = 0; i < 8; i++) output[i+offset] = (byte)( (bits >> ( i * 8) ) & 0xff); } public void doubleToBytes_BE(double input, byte[] output, int offset ) { long bits = Double.doubleToLongBits(input); for(int i = 0; i < 8; i++) output[i+offset] = (byte)( (bits >> ( (7-i) * 8) ) & 0xff); }
반대의 경우
ByteBuffer.wrap(tmpBuffer, 0, 4).order(ByteOrder.LITTLE_ENDIAN).getShort(); ByteBuffer.wrap(tmpBuffer, 0, 4).order(ByteOrder.LITTLE_ENDIAN).getInt(); ByteBuffer.wrap(tmpBuffer, 0, 4).order(ByteOrder.LITTLE_ENDIAN).getFloat(); ByteBuffer.wrap(tmpBuffer, 0, 8).order(ByteOrder.LITTLE_ENDIAN).getLong(); ByteBuffer.wrap(tmpBuffer, 0, 8).order(ByteOrder.LITTLE_ENDIAN).getDouble();
이걸 쓰면 된다.
답글 남기기