본문
[Java] Byte 배열과 (바이너리)문자열 상호 변환하기
public String byteArrayToBinaryString(byte[] b){
StringBuilder sb=new StringBuilder();
for(int i=0; i<b.length; ++i){
sb.append(byteToBinaryString(b[i]));
}
return sb.toString();
}
public String byteToBinaryString(byte n) {
StringBuilder sb = new StringBuilder("00000000");
for (int bit = 0; bit < 8; bit++) {
if (((n >> bit) & 1) > 0) {
sb.setCharAt(7 - bit, '1');
}
}
return sb.toString();
}
public byte[] binaryStringToByteArray(String s){
int count=s.length()/8;
byte[] b=new byte[count];
for(int i=1; i<count; ++i){
String t=s.substring((i-1)*8, i*8);
b[i-1]=binaryStringToByte(t);
}
return b;
}
public byte binaryStringToByte(String s){
byte ret=0, total=0;
for(int i=0; i<8; ++i){
ret = (s.charAt(7-i)=='1') ? (byte)(1 << i) : 0;
total = (byte) (ret|total);
}
return total;
}
byte를 String으로 출력하기 위해, new String()으로 바로 건네주는 방법이 있지만 간혹 원하는 결과가 나오지 않아서 찾던중, Converting large byte array to binary string 라는 페이지에서 byteToBinaryString이라는 코드를 발견하고 이에 byte[]를 지원하기 위하여 추가하여 시리즈로 올린다. byteArrayToBinaryString()에 byte[] 를 넣으면 String으로 변환, byteStringToByteArray에 String을 넣으면 byte[]를 반환하는 매우 간단한 소스이다.
참고로 이 메소드에는 비트 연산자와 시프트 연산자가 사용이 되었는데, 다음의 예를 보면서 이해하면 쉽다.
우선 n=10110101이라고 가정한다 for문에서bit가 0일때, 쉬프트 되지 않은 채로 &연산자를 만난다. 1은 byte로 표시하면 00000001이고, and연산자는 각 비트가 동일해야 1을 출력하는것이므로 첫번째 루프에서는 1이 반환되고, 이는 0보다 크므로 if문 내의 명령을 처리한다(7번째 문자를 1로 정한다.)
다음, bit가 1일 경우에는 shift연산자에 의해 한칸씩 오른쪽으로 밀리고, 가장 왼쪽에 있던 위치는 가장 왼쪽에 있었던 숫자인 1로 채운다. 즉, n>>1은 11011010이 되는것이다. 여기서 00000001과 and연산자를 하게되면 0이 출력되므로 if문의 내부는 실행되지 않는다. 이런 원리로 뒷부분부터 수정이 일어남을 확인할 수 있다.
그리고 마찬가지로 byteStringToByteArray("100010101010110")으로 입력하면 byte[]로 된 값이 반환될것이며, 원리는 위와 크게 다르지 않다. 중간에 (byte)로 캐스팅 해주긴 했는데, 특히 total=ret|total 식을 그냥 쓰면 int->byte로 변환할수 없다고 오류가 나와서 명시적 캐스팅은 해줬다. 어디서 int가 나오는지...
StringBuilder sb=new StringBuilder();
for(int i=0; i<b.length; ++i){
sb.append(byteToBinaryString(b[i]));
}
return sb.toString();
}
public String byteToBinaryString(byte n) {
StringBuilder sb = new StringBuilder("00000000");
for (int bit = 0; bit < 8; bit++) {
if (((n >> bit) & 1) > 0) {
sb.setCharAt(7 - bit, '1');
}
}
return sb.toString();
}
public byte[] binaryStringToByteArray(String s){
int count=s.length()/8;
byte[] b=new byte[count];
for(int i=1; i<count; ++i){
String t=s.substring((i-1)*8, i*8);
b[i-1]=binaryStringToByte(t);
}
return b;
}
public byte binaryStringToByte(String s){
byte ret=0, total=0;
for(int i=0; i<8; ++i){
ret = (s.charAt(7-i)=='1') ? (byte)(1 << i) : 0;
total = (byte) (ret|total);
}
return total;
}
byte를 String으로 출력하기 위해, new String()으로 바로 건네주는 방법이 있지만 간혹 원하는 결과가 나오지 않아서 찾던중, Converting large byte array to binary string 라는 페이지에서 byteToBinaryString이라는 코드를 발견하고 이에 byte[]를 지원하기 위하여 추가하여 시리즈로 올린다. byteArrayToBinaryString()에 byte[] 를 넣으면 String으로 변환, byteStringToByteArray에 String을 넣으면 byte[]를 반환하는 매우 간단한 소스이다.
참고로 이 메소드에는 비트 연산자와 시프트 연산자가 사용이 되었는데, 다음의 예를 보면서 이해하면 쉽다.
우선 n=10110101이라고 가정한다 for문에서bit가 0일때, 쉬프트 되지 않은 채로 &연산자를 만난다. 1은 byte로 표시하면 00000001이고, and연산자는 각 비트가 동일해야 1을 출력하는것이므로 첫번째 루프에서는 1이 반환되고, 이는 0보다 크므로 if문 내의 명령을 처리한다(7번째 문자를 1로 정한다.)
다음, bit가 1일 경우에는 shift연산자에 의해 한칸씩 오른쪽으로 밀리고, 가장 왼쪽에 있던 위치는 가장 왼쪽에 있었던 숫자인 1로 채운다. 즉, n>>1은 11011010이 되는것이다. 여기서 00000001과 and연산자를 하게되면 0이 출력되므로 if문의 내부는 실행되지 않는다. 이런 원리로 뒷부분부터 수정이 일어남을 확인할 수 있다.
그리고 마찬가지로 byteStringToByteArray("100010101010110")으로 입력하면 byte[]로 된 값이 반환될것이며, 원리는 위와 크게 다르지 않다. 중간에 (byte)로 캐스팅 해주긴 했는데, 특히 total=ret|total 식을 그냥 쓰면 int->byte로 변환할수 없다고 오류가 나와서 명시적 캐스팅은 해줬다. 어디서 int가 나오는지...
n>>0 | n>>1 | n>>2 | n>>3 | n>>4 | n>>5 | n>>6 | n>>7 | |
n>>i | 10110101 | 11011010 | 11101101 | 11110110 | 1111011 | 1111101 | 1111110 | 11111111 |
1 | 00000001 | 00000001 | 00000001 | 00000001 | 00000001 | 00000001 | 00000001 | 00000001 |
n&1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 |
댓글