달력

02

« 2012/02 »

  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  •  
  •  
  •  
개발환경은 JEE 이지만 실제코드와 업무영역은 JSE에 가까워서 JavaSE 카테고리에 넣어둡니다. 이전 자료입니다^^;;


프로젝트 진행중에 클라이언트는 C++로 작성되어져 있고,

서버는 J2EE A/S를 기반으로 작성되어져 있습니다.

여러가지 연동 중에 소켓을 통해서 데이터를 주고 받는 게 있는데, 그 중에 2바이트 유니코드를 받아서 처리해야 하는 부분이 있었습니다.

많은 곳에 찾아봐도 해답을 얻지 못했는데, 하루 밤을 새워 알게 되었습니다.

도움이 되었으면 좋겠군요^^


먼저 네트워크에서는 big-endian byte order를 지켜야 함을 명시합니다.

만약 '홍길동'이란 단어를 실제 유니코드를 표현하면 다음과 같습니다.


\ud64d\uae38\ub3d9


그러나, 네트웍에서는 2바이트로 어떻게 들어올까요?

16진수로 표현하면 다음과 같이 들어오게 됩니다.


0x4d 0x64 0x38 0xua 0xd9 0xb3

쉽게표현하면 위와 같이 들어오는 것이고 이를 그냥 stream으로 네트워크에서는 들어오기 때문에 DataInputStream으로 표현하여 StringBuffer에 넣으면 다음과 같이 나오게 됩니다.


4d6438uad9b3


때문에 이를 다음과 같이 변환해 주어야 합니다. 왜냐하면 네크워크에서는 big-endian으로 들어오기 때문이죠...

그리고, 위의 '홍길동'에서는 0x01과 같이 앞 바이트가 '0'이 들어가는 게 없어서 괜찮은데, 만약 '0'이 들어오면 임의로 '0'을 추가해 주어야 합니다.


예제 소스를 첨부합니다


StringBuffer sb = new StringBuffer();

byte[] buf = new byte[4096];
int pos = dataInputStream.read(buf, 0, 4096);

byte[] stringName = new byte[80];

for ( int i=0; i < pos; i+=2 ) {
    String uniString = "\\u";
    
    i += 1;
    try {
       stringName [i] = buf.getByte();
    } catch (Exception e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
    }


    String tempString1 = Integer.toHexString(stringName [i] & 0x000000FF);
    if ( tempString1.length() == 1 )
      tempString1 = "0" + tempString1;
    uniString += tempString1;

    i -= 1;
    try {
      stringName [i] = buf.getByte();
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }


    String tempString2 = Integer.toHexString(stringName [i] & 0x000000FF);
    if ( tempString2.length() == 1 )
       tempString2 = "0" + tempString2;
    uniString += tempString2;
    
    sb.append(ByteUtil.UnitoStr(uniString));
}


소스를 가능하면 명확하게 하기 위해 노력했습니다^^

모두 행복하게 살았으면 좋겠네요ㅎㅎ
Posted by korcslewis