2008. 12. 11. 14:45

[JAVA]16진수 ascii문자를 특정 문자로 치환하기




내용 : byte array로 저장된 data에 특수문자값을 찾아서 정의된 문자로 치환하기
전제 : 10진수 0부터 32까지 문자만 그 대상으로 한다

process :
I. HashMap에 (1)16진수값 = 이름 (2) 이름 = 16진수값 이 매핑되도록 설정
II. byte array를 parameter로 받아 loop로 array 탐색
III. byte array를 16진수로 변환하여 HashMap에 그 내용이 있는지 확인
IV. 관련된 내용이 발견되면 치환

번외: 위 작업한 내용을 다시 정상 data로 복원 시키는 모듈

(CODE)
1. Integer.toHexString(int i)
설명 : 10진수 int형 i 값을 16진수로 변환한다.

public String hex2string(byte[] b, String prefix){
 if(b == null || b.length <= 0) return null;  
 StringBuffer sb = new StringBuffer();  
 for(int i=0; i<b.length; i++){  
  int j = b[i];
  if(j < 33){
   if(ASCII_HEX_TABLE.get(Integer.toHexString(j)) != null){
    sb.append(prefix+ASCII_HEX_TABLE.get(Integer.toHexString(j))+prefix);
   }
  }else{
   sb.append((char)b[i]);
  }
 }  
 return sb.toString();
}

(추가) 한글로 값이 넘어오는 경우 처리
  public String hex2string(byte[] b, String prefix){
       if(b == null || b.length <= 0) return null;
      
       try{
           String s = new String(b, "MS949");
      
           StringBuffer sb = new StringBuffer();
          
           for(int i=0; i<s.length(); i++){
               int j = s.charAt(i);
               if(j < 33){
                   if(ASCII_HEX_TABLE.get(Integer.toHexString(j)) != null){
                       sb.append(prefix+ASCII_HEX_TABLE.get(Integer.toHexString(j))+prefix);
                   }
               }else{
                   sb.append((char)s.charAt(i));
               }
           }
          
           return sb.toString();
       }catch(Exception e){return null;}
   }


2. (char)Integer.parseInt(String.valueOf(Long.decode("0x"+hexCode)))
설명 : 16진수 문자값을 그에 해당하는 문자로 변환시킴
Long.decode("0x"+hexCode) : 16진수 문자값(: hexCode)을 16진수 숫자값으로 변환

public byte[] string2hex(String s, String prefix){
 if(s == null || s.equals("")) return null;
 
 StringBuffer sb = new StringBuffer();
 
 StringTokenizer st = new StringTokenizer(s,prefix);
 String partString = "";
 String hexCode = "";
 while (st.hasMoreTokens()) {
  partString = st.nextToken();
  if(partString != null && !partString.equals("")){
   if(ASCII_NAME_TABLE.get(partString) != null){
    hexCode = (String)ASCII_NAME_TABLE.get(partString);
    sb.append((char)Integer.parseInt(String.valueOf(Long.decode("0x"+hexCode))));
   }else{
    sb.append(partString);
   }
  }   
 }
 return sb.toString().getBytes();
}