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

안드로이드 플젝을 하다가 보니 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();

이걸 쓰면 된다.


Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다