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 is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

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