JAVA

[JAVA] hex 값 String으로 변환

SongMinu 2020. 3. 13. 12:21
728x90

구글링 해보면 간단한 소스가 정말 많음

내가 처음 필요했던 건 웹에서 hex값과 인코딩 타입을 java단에 넘겨가지고 string으로 변환해서 다시 웹단에 넘겨준 후 화면에 보여주는 거라 딱 세줄 이면 가능한 소스가 있길래 사용함

String hex = param.get("hex").toString();    
String type = param.get("type").toString(); //웹에선 UTF-8, EUC-KR 같은 값을 넘겨줌
byte[] bytes = Hex.decodeHex(hex.toCharArray());
String st = new String (bytes, type);

return st;

더 찾아보니 더 간단한 소스들도 꽤 많이 보였음

 

이 결괏값을 웹단에서 받은 뒤 따로 받은 포지션 값을 (예: ["11 25", "50 55"]) 이용해 문자 사이사이에 html태그를 삽입해 하이라이트 처리를 했으나 문제가 좀 발견이 되가지고...

자바단에서 모두 처리하게 변경함

1. 웹단에서 hex값, 인코딩 타입, 포지션 값을 넘김

2. 전달받은 포지션 값을 시작 숫자랑 끝 숫자를 따로따로 저장

3. hex값을 2개씩 문자로 변환해서 한 글자씩 만들 때 인코딩 타입을 이용해서 변환

4. for문을 돌면서 시작 숫자랑 같으면 html 태그 앞에 껄 삽입, 뒷 숫자랑 같으면 html 종료 태그 삽입

이런 식으로 한 글자씩 조합시키는 방식이 필요해서 만듦

  StringBuilder sb = new StringBuilder();
  String front = "<span style=\"background-color:#e25d5d;\">"; //하이라이트용 html 시작 태그
  String end = "</span>"; //하이라이트 종료 태그

  ArrayList<Integer> start_num = new ArrayList<>();
  ArrayList<Integer> end_num = new ArrayList<>();
  for (int i = 0; i < pos.size(); i++) {
      String pos_str = pos.get(i).toString();
      start_num.add(Integer.parseInt(pos_str.split(" ")[0].toString())); //시작 숫자 담기
      end_num.add(Integer.parseInt(pos_str.split(" ")[1].toString())); //종료 숫자 담기
  }

  /*
  * 값에 html 태그가 들어있으면 화면에 뿌릴 때
  * html 태그가 먹혀서 문제가 생길 수도있어서 변환하기 위한 작업 
  * < 또는 > 는 ' 로 변환 시키기위한 준비
  */
  Pattern pattern = Pattern.compile("[<|>]"); 
  Matcher match;
  Boolean bool;

  int j = 0;
  char[] charArr = hex.toCharArray();
  for (int i = 0; i < charArr.length; i+=2) {
      if (start_num.contains(j)) { // 시작 숫자랑 같으면 넣기
          sb.append(front);
      }

      String str = "" + charArr[i] + "" charArr[i + 1]; //hex값 2개
      char ch = (char) Integer.parseInt(str, 16); // 변환
      String str2 = new String(Character.toString(ch).getBytes(), type); //바이트로 바꿔서 인코딩 타입을 이용해 스트링으로 변환
      match = pattern.matcher(str2); //변환된 값에 < 또는 > 가 있는지 확인
      bool = match.matches(); // 있으면 true 없으면 false
      if (bool) { // 있으면?
          sb.append("'");
      } else { // 없으면?
          sb.append(str2);
      }

      if (end_num.contains(j)) {//종료 숫자랑 같으면 넣기
          sb.append(end);
      }

      j++;
  }
  rs = sb.toString();

통으로 변환할 때 인코딩 타입을 이용하거나 한 글자씩 처리하는 건 많았는데

한 글자씩 처리하면서 인코딩 타입을 이용하는 건 도저히 못 찾겠어서

하나씩 찾아서 짬뽕하다 보니 만들긴 했는데 

제대로 만든 건진 모르겠다... 그래도 일단 기존 문제는 해결됐고 잘된다.

 

이런 식으로 한 글자씩 처리하면서 할게 아니라면 쉽고 좋은 소스가 많으니 이런 방법도 있구나 정도만 보면 될 듯...

 

 

 

반응형