티스토리 뷰

목차

    반응형

    예전 글에서 자바스크립트를 활용한 문자열과 hex 변환 방법을 소개했는데요. "[JavaScript] 문자열 <-> UTF8, UTF16 진수 한글 변환 (HEX to string)"


    이 포스트에선 자바스크립트 소스 코드를 타입스크립트로 변환하여 소개합니다. 저도 아직 TypeScript가 익숙한 편이 아니라 타입스크립트를 타입스크립트 처럼 명확히 이용했는지 약간 의구심은 듭니다.


    그래도, 프로젝트 소스에 올려 잘 구동하는 것 확인했으니 TypeScript 사용 중이시라면 한 번 쯤 참고해 보시는 게 좋다고 생각합니다.



    prototype001.js --- UTF8⇔16 진수 문자열 변환 Javascript

    // 문자열을 UTF8 16 진수 문자열로 변환 


    stringToUtf8HexString = (text: any) => {

      const bytes1 = util.stringToUtf8Bytes(text);

      const hexStr1 = util.bytesToHexString(bytes1);

      return hexStr1;

    };


    // 문자열을 UTF8 바이트 배열로 변환


    stringToUtf8Bytes = (text: any) => {

      const result: any[] = [];


      if (text == null) return result;


      for (let i = 0; i < text.length; i++) {

        const c = text.charCodeAt(i);


        if (c <= 0x7f) {

          result.push(c);

        } else if (c <= 0x07ff) {

          result.push(((c >> 6) & 0x1f) | 0xc0); // eslint-disable-line no-bitwise

          result.push((c & 0x3f) | 0x80); // eslint-disable-line no-bitwise

        } else {

          result.push(((c >> 12) & 0x0f) | 0xe0); // eslint-disable-line no-bitwise

          result.push(((c >> 6) & 0x3f) | 0x80); // eslint-disable-line no-bitwise

          result.push((c & 0x3f) | 0x80); // eslint-disable-line no-bitwise

        }

      }

      return result;

    };


    eslint airbnb에선 >> << 이런 연산을 허용하지 않아요. 그래서 오른쪽 처럼 주석 형태 커맨드 삽입이 필요합니다.


    // 16 진수 문자열을 바이트 값으로 변환 


    hexToByte = (hexStr: string) => {

      return parseInt(hexStr, 16);

    };


    // 바이트 배열을 16 진수 문자열로 변환 


    hexStringToBytes = (hexStr: any) => {

      const result = [];


      for (let i = 0; i < hexStr.length; i += 2) {

        result.push(util.hexToByte(hexStr.substr(i, 2)));

      }


      return result;

    };


    // UTF8 바이트 배열을 문자열로 변환


    utf8BytesToString = (arr: any) => {

      let result: string = '';

      let i;


      while (arr.length !== 0) {

        i = arr.shift();


        if (i <= 0x7f) {

          // eslint-disable-line no-bitwise

          result += String.fromCharCode(i);

        } else if (i <= 0xdf) {

          let c = (i & 0x1f) << 6; // eslint-disable-line no-bitwise

          c += arr.shift() & 0x3f; // eslint-disable-line no-bitwise

          result += String.fromCharCode(c);

        } else if (i <= 0xe0) {

          let c = ((arr.shift() & 0x1f) << 6) | 0x0800; // eslint-disable-line no-bitwise

          c += arr.shift() & 0x3f; // eslint-disable-line no-bitwise

          result += String.fromCharCode(c);

        } else {

          let c = (i & 0x0f) << 12; // eslint-disable-line no-bitwise

          c += (arr.shift() & 0x3f) << 6; // eslint-disable-line no-bitwise

          c += arr.shift() & 0x3f; // eslint-disable-line no-bitwise

          result += String.fromCharCode(c);

        }

      }


      return result;

    };


    // 바이트 값을 16 진수 문자열로 변환


    byteToHex = (byteNum: any) => {

      const digits = byteNum.toString(16);

      const rtn = '0';

      const rtn2 = rtn + digits;


      if (byteNum < 16) return rtn2;


      return digits;

    };


    // 바이트 배열을 16 진수 문자열로 변환


    bytesToHexString = (bytes: any) => {

      let result = '';


      for (let i = 0; i < bytes.length; i++) {

        result += util.byteToHex(bytes[i]);

      }

      return result;

    };


    // UTF8 16 진수 문자열을 문자열로 변환


    utf8HexStringToString = (hexStr1: any) => {

      const bytes2 = util.hexStringToBytes(hexStr1);

      const str2: string = util.utf8BytesToString(bytes2);

      return str2;

    };


    사용 방법은 예전 포스트 참조하시면 되고요.

    타입스크립트 사용 중에 에러가 발생한다면 댓글로 알려주세요. 함께 방법을 찾아봐요.



    반응형