none
유니 코드 환경에서 memmove 함수 사용시 RRS feed

  • 질문

  • 멀티 바이트 문자 셋 환경

    int CSentinelSP::Authenticate(CString csQuery="DEF4B5D5", CString csCompare)
    {

    RB_BYTE queryData[SPRO_MAX_QUERY_SIZE]; // Query Data

    memmove(queryData, csQuery.GetBuffer(SPRO_MAX_QUERY_SIZE), SPRO_MAX_QUERY_SIZE);

    csQuery.ReleaseBuffer();

    여기까지 샐행 결과 queryData[0] = 'D' queryData[1] = 'E' ~ 이런식으로 순차적으로 값을 담게 됩니다.

    }

    유니 코드 문자 셋 환경

    int CSentinelSP::Authenticate(CString csQuery="DEF4B5D5", CString csCompare)
    {

    RB_BYTE queryData[SPRO_MAX_QUERY_SIZE]; // Query Data

    memmove(queryData, csQuery.GetBuffer(SPRO_MAX_QUERY_SIZE), SPRO_MAX_QUERY_SIZE);

    csQuery.ReleaseBuffer();

    여기까지 샐행 결과 queryData[0] = 'D' queryData[1] = '0' queryData[2] = 'E' queryData[3] = '0' ~

    이런식으로 "0"을  한게씩 담고 있내요 

    }

    제가 원하는 결과는 "유니 코드 문자 셋"에서도 queryData의 결과 값이 "멀티 바이트 문자 셋"과 동일한

    queryData[0] = 'D' queryData[1] = 'E' "0"이 포함되지않은 순차적인 배열값을 얻고 싶습니다. 

    어떻게 해야하나요?



    2012년 5월 25일 금요일 오전 6:24

답변

  • 그런 경우에는, 일단 유니코드로 인코딩된 데이터를 멀티 바이트 셋으로 변경해 주어야 합니다. 이를 위해서 다음의 함수를 이용해 주어야 하는데요.

    WideCharToMultiByte function
    ; http://msdn.microsoft.com/en-us/library/windows/desktop/dd374130(v=vs.85).aspx

    제시하신 예제 코드를 윈도우의 기본 ANSI 코드 페이지로 지정해서 멀티 바이트 셋으로 바꾼다면 다음과 같이 코딩이 될 수 있습니다.

        CString csQuery = L"DEF4B5D5";
        BYTE queryData[100] = { 0 };
     
        ::WideCharToMultiByte(CP_ACP, 0, csQuery, csQuery.GetLength(), (LPSTR)queryData, 100, NULL, NULL);

    queryData 에는 바이트 순서대로 "DEF4B5D5" 값이 들어가게 됩니다.

    2012년 5월 25일 금요일 오전 11:38