short, int, long, float, double 형을 byte 형으로 변환 (Java)

안드로이드 플젝을 하다가 보니
ByteBuffer로 short이나 int 형을 byte[]로 변환하는데 내가 사용을 잘못한건지
가끔 제대로 변환이 안되고 그냥 이전에 변환된 배열을 리턴하는 경우를 발견했다.

초당 수백번씩 호출해서 그런건지 (내부에 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();

이걸 쓰면 된다.
이건 딱히 문제 없이 잘 됨


크리에이티브 커먼즈 라이선스Linsoo의 저작물인 이 저작물은(는)크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

댓글 남기기

이메일은 공개되지 않습니다.

This site uses Akismet to reduce spam. Learn how your comment data is processed.