자바에서 바이트배열을 수로 바꾸기, 수를 바이트배열로 바꾸기
참고사항
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; } } |
오랜만에 글쓰네요.
'프로그래밍(~2017) > 자바' 카테고리의 다른 글
[자바] SimpleDateFormat 데이터형식 (0) | 2012.01.04 |
---|---|
[자바] URL , HttpURLConnection 에서 파라미터(parameter) 인코딩(utf-8) 관련 (1) | 2011.12.28 |
[자바] 현재 자바의 인코딩 방식 알아보는 방법 (0) | 2011.12.28 |
[JAVA] 이클립스에서 주석 이쁘게 달기 (자동완성기능 사용했을때 내용뜨기) (0) | 2011.12.05 |
[자바] MD5 만드는 함수 (0) | 2011.11.11 |