프로그래밍(~2017)/자바

[JAVA] byte to int, double, etc (혹은 그반대) 등 코드포함

단세포소년 2016. 7. 1. 16:12
반응형

자바에서 바이트배열을 수로 바꾸기, 수를 바이트배열로 바꾸기



참고사항

byte 에서 int 형변환시 lsb 커진다. 무슨 말이냐 하면

 

byte 0x80 하자. 그럼 1000 0000 이다.

 

byte 부호있는 십진수로 보면 -128이다.

 

int i= byte 라 하면  int i 값은 -128이다.

 

왜냐면 작은 크기의 형이 형으로 변환될 때는 lsb  부호 비트 값이 왼쪽 모두를 채운다.

 

1000 1000 -> 0000 0000 0000 0000 0000 0000 1000 0000 되기를 기대하지만 실제로는

1000 0000 -> 1111 1111 1111 1111 1111 1111 1000 0000 된다. unsigned 없는 자바 로써는 당연한거다.(byte signed ) 인식한다. 다시 말해 1000 0000 앞의 1 부호 비트라보고 변수형으로 커질때 왼쪽을 부호 비트로 채운다.

 

아래와 같이 해야한다.

int I = (byte & 0xff) 해주어야 한다.

 

그럼 1111 1111 1111 1111 1111 1111 1111 1111 &  0000 0000 0000 0000 0000 0000 1111 1111 =  0000 0000 0000 0000 0000 0000 1111 1111




예제소스


위의 내용을 바탕으로 자바에서 난 이런식으로 사용하였다.


바이트배열을 수로, 수를 바이트로 만들기

byte array to int, double, float, long, short And short, int, double, float, long, to byte array

import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class BytesValue extends Number implements BytesInOutStream { static enum ENDIAN{ BIG_ENDIAN, LIITLE_ENDIAN } private byte[] bytes; private ENDIAN endian; private int byteSize; public BytesValue(int byteSize) { this.byteSize = byteSize; this.bytes = new byte[byteSize]; this.endian = ENDIAN.BIG_ENDIAN; } public void setOrder(ENDIAN endian) { byte[] temp = this.bytes; if(this.endian!=endian) { temp=Util.reverse(this.bytes); } this.endian = endian; this.bytes = temp; } public byte[] getBytes(ENDIAN endian) { byte[] temp = this.bytes; if(this.endian!=endian) { temp=Util.reverse(this.bytes); } return temp; } public void setBytes(byte[] bytes, ENDIAN endian) { byte[] temp = bytes; if(this.endian!=endian) { temp=Util.reverse(this.bytes); } System.arraycopy(temp, 0, this.bytes,0 ,(int) this.byteSize); } public void setByte(byte value) { this.bytes[0]=value; } public void setShort(short value) { int size=Short.SIZE; byte[] temp = new byte[this.byteSize]; for(int i=0;i<this.byteSize && i<size;i++) { temp[i] = (byte)((value >> (8*i)) & 0xff); } if(this.endian == ENDIAN.BIG_ENDIAN) { temp = Util.reverse(temp); } this.bytes = temp; } public void setInt(int value) { int size=Integer.SIZE; byte[] temp = new byte[this.byteSize]; for(int i=0;i<this.byteSize && i<size;i++) { temp[i] = (byte)((value >> (8*i)) & 0xff); } if(this.endian == ENDIAN.BIG_ENDIAN) { temp = Util.reverse(temp); } this.bytes = temp; } public void setLong(long value) { int size=Long.SIZE; byte[] temp = new byte[this.byteSize]; for(int i=0;i<this.byteSize && i<size;i++) { temp[i] = (byte)((value >> (8*i)) & 0xff); } if(this.endian == ENDIAN.BIG_ENDIAN) { temp = Util.reverse(temp); } this.bytes = temp; } public void setFloat(float value) { int size=Float.SIZE; long valueTwo = Float.floatToRawIntBits(value); byte[] temp = new byte[this.byteSize]; for(int i=0;i<this.byteSize && i<size;i++) { temp[i] = (byte)((valueTwo >> (8*i)) & 0xff); } if(this.endian == ENDIAN.BIG_ENDIAN) { temp = Util.reverse(temp); } this.bytes = temp; } public void setDouble(Double value) { int size=Double.SIZE; long valueTwo = Double.doubleToRawLongBits(value); byte[] temp = new byte[this.byteSize]; for(int i=0;i<this.byteSize && i<size;i++) { temp[i] = (byte)((valueTwo >> (8*i)) & 0xff); } if(this.endian == ENDIAN.BIG_ENDIAN) { temp = Util.reverse(temp); } this.bytes = temp; } @Override public byte byteValue() { byte[] temp = this.bytes; if(this.endian==ENDIAN.BIG_ENDIAN) { temp=Util.reverse(this.bytes); } return (byte)(temp[0] & 0xff); } @Override public short shortValue() { byte[] temp = this.bytes; if(this.endian==ENDIAN.BIG_ENDIAN) { temp=Util.reverse(this.bytes); } long ret=0; for(int i=0;i<this.byteSize;i++) { ret |= ((temp[i]& 0xff)<< (8*i)); } return (short)ret; } @Override public double doubleValue() { byte[] temp = this.bytes; if(this.endian==ENDIAN.BIG_ENDIAN) { temp=Util.reverse(this.bytes); } long ret=0; for(int i=0;i<this.byteSize;i++) { ret |= ((temp[i]& 0xff)<< (8*i)); } return Double.longBitsToDouble(ret); } @Override public float floatValue() { byte[] temp = this.bytes; if(this.endian==ENDIAN.BIG_ENDIAN) { temp=Util.reverse(this.bytes); } long ret=0; for(int i=0;i<this.byteSize;i++) { ret |= ((temp[i]& 0xff)<< (8*i)); } return Float.intBitsToFloat((int)ret); } @Override public int intValue() { byte[] temp = this.bytes; if(this.endian==ENDIAN.BIG_ENDIAN) { temp=Util.reverse(this.bytes); } long ret=0; for(int i=0;i<this.byteSize;i++) { ret |= ((temp[i]& 0xff)<< (8*i)); } return (int)ret; } @Override public long longValue() { byte[] temp = this.bytes; if(this.endian==ENDIAN.BIG_ENDIAN) { temp=Util.reverse(this.bytes); } long ret=0; for(int i=0;i<this.byteSize;i++) { ret |= ((temp[i]& 0xff)<< (8*i)); } return ret; } @Override public int getByteCount() { return this.byteSize; } @Override public void writeOutputStream(OutputStream output,int offset, int lenth) throws IOException { output.write(this.bytes, offset, lenth); } @Override public int readInputStream(InputStream input,int offset, int lenth) throws IOException { int readCount = input.read(this.bytes, offset, lenth); return readCount; } }

 




byte 배열의 값 순서 reverse 하기

import java.util.ArrayList; public class Util { public static byte[] reverse(byte[] objects) { byte[] temp = new byte[objects.length]; for (int left = 0, right = objects.length - 1; left <= right; left++, right--) { temp[left]=objects[right]; temp[right]=objects[left]; } return temp; }  

} 



바이트를 문자열로 문자열을 바이트로 만들기

byte to string and string to byte

 import java.io.IOException;

import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.util.Arrays; /** * Created by shh on 2016-03-28. */ public class BytesChars implements BytesInOutStream{ private byte[] bytes; private int byteSize=-1; public BytesChars(int byteSize) { this.byteSize = byteSize; bytes = new byte[byteSize]; } public byte[] getBytes() { byte[] temp = this.bytes; return temp; } public void setBytes(byte[] bytes) { byte[] temp = bytes; if(temp.length > this.byteSize) { System.arraycopy(temp, 0, this.bytes,0 ,(int) this.byteSize); }else { System.arraycopy(temp, 0, this.bytes,0 , temp.length); } } public void setString(String str, String charsetName) throws UnsupportedEncodingException { byte[] temp = str.getBytes(charsetName); this.setBytes(temp); } public String getString(String charsetName) throws UnsupportedEncodingException { int nullIndex = this.byteArrayindexOf(this.bytes,(byte)0,0); if(nullIndex==-1) { return new String(this.bytes,0,this.bytes.length,charsetName); }else { return new String(this.bytes,0,nullIndex,charsetName); } } public int byteArrayindexOf(byte[] array, byte valueToFind, int startIndex) { if (array == null) { return -1; } if (startIndex < 0) { startIndex = 0; } for (int i = startIndex; i < array.length; i++) { if (valueToFind == array[i]) { return i; } } return -1; } @Override public int getByteCount() throws Exception { return this.byteSize; } @Override public void writeOutputStream(OutputStream output,int offset, int lenth) throws IOException { output.write(this.bytes, offset, lenth); } @Override public int readInputStream(InputStream input,int offset, int lenth) throws IOException { int readCount = input.read(this.bytes, offset, lenth); return readCount; } }




오랜만에 글쓰네요.


반응형