2008. 12. 11. 14:45
[JAVA]16진수 ascii문자를 특정 문자로 치환하기
2008. 12. 11. 14:45 in 개발/자바
내용 : 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진수로 변환한다.
(추가) 한글로 값이 넘어오는 경우 처리
2. (char)Integer.parseInt(String.valueOf(Long.decode("0x"+hexCode)))
설명 : 16진수 문자값을 그에 해당하는 문자로 변환시킴
Long.decode("0x"+hexCode) : 16진수 문자값(: hexCode)을 16진수 숫자값으로 변환
전제 : 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();
}
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;}
}
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();
}
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();
}