로그인

검색

C/C++
2012.11.15 16:09

C++에서 base64로 인코딩

조회 수 665 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 게시글 수정 내역 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 게시글 수정 내역 댓글로 가기 인쇄

void wstrToUtf8(string& dest, const wstring& src){
    dest.clear();
    for (size_t i = 0; i < src.size(); i++){
        wchar_t w = src[i];
        if (w <= 0x7f)
            dest.push_back((char)w);
        else if (w <= 0x7ff){
            dest.push_back(0xc0 | ((w >> 6)& 0x1f));
            dest.push_back(0x80| (w & 0x3f));
        }
        else if (w <= 0xffff){
            dest.push_back(0xe0 | ((w >> 12)& 0x0f));
            dest.push_back(0x80| ((w >> 6) & 0x3f));
            dest.push_back(0x80| (w & 0x3f));
        }
        else if (w <= 0x10ffff){
            dest.push_back(0xf0 | ((w >> 18)& 0x07));
            dest.push_back(0x80| ((w >> 12) & 0x3f));
            dest.push_back(0x80| ((w >> 6) & 0x3f));
            dest.push_back(0x80| (w & 0x3f));
        }
        else
            dest.push_back('?');
    }
}
 
 
string wstrToUtf8(const wstring& str){
    string result;
    wstrToUtf8(result, str);
    return result;
}
 
 
//===========================================================
// base64
//===========================================================
std::wstring base64Encode(const wstring input){
    string utf8_input = wstrToUtf8(input);
 
    unsigned char const* buffer = (unsigned const char*)(utf8_input.c_str());
    size_t size = utf8_input.length();
 
    using std::wstring;
    static wchar_t const* base64Table =
        L"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
     
    // for =
    // size_t base64Size = (size + 2 - ((size + 2) % 3)) / 3 * 4;
    // wstring result(base64Size, L'=');
 
    size_t base64Size = ceil(size * 4.0 / 3);
    wstring result(base64Size, L'');
 
    unsigned char const* s = buffer;  // source pointer
    size_t di = 0;                    // destination index
    for(size_t i = 0; i < size / 3; i++){
        // input: 0000_0000 0000_0000 0000_0000
        // 
        // out1:  0000_00
        // out2:         00 0000
        // out3:                _0000 00
        // out4:                        00_0000
         
        result[di++] = base64Table[s[0] >> 2];
        result[di++] = base64Table[((s[0] << 4) | (s[1] >> 4)) & 0x3f];
        result[di++] = base64Table[((s[1] << 2) | (s[2] >> 6)) & 0x3f];
        result[di++] = base64Table[s[2] & 0x3f];
        s += 3;
    }
 
    size_t remainSize = size % 3;
    switch(remainSize){
    case 0:
        break;
    case 1:
        result[di++] = base64Table[s[0] >> 2];
        result[di++] = base64Table[(s[0] << 4) & 0x3f];
        break;
    case 2:
        result[di++] = base64Table[s[0] >> 2];
        result[di++] = base64Table[((s[0] << 4) | (s[1] >> 4)) & 0x3f];
        result[di++] = base64Table[(s[1] << 2) & 0x3f];
        break;
    default:
        throw std::logic_error("Should not happen.");
    }
    return result;
}
 
 
 
int main() {
    wcout.imbue(locale("korean"));
 
    wstring plain(L"대한민국");
    wcout << base64Encode(plain).c_str() << endl;
 
    return 0;
}


http://crystalcube.co.kr/102

?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 Tool/etc Programming 게시판 관련 2 MoA 2014.11.01 2490
87 C/C++ 코드 실행 시간 계산 Naya 2012.08.02 330
86 Tool/etc 에디트 플러스, VS 2008 컴파일 환경 설정 MoA 2013.07.28 330
85 STL/Boost Boost c++ Libraries (설명, 정리) Naya 2012.08.02 326
84 Library pthread MoA 2013.07.28 324
83 Site 검색엔진 개발자 그룹 MoA 2013.08.30 324
82 Tool/etc 어셈블리어 컴파일 - 기초 Naya 2012.08.02 322
81 API/MFC #pragma MoA 2013.07.28 321
80 Site 디자인 패턴 정리 너울 2011.09.21 319
79 Site 알고리즘 정리된 블로그 MoA 2013.07.28 319
78 Tool/etc 앱 디자인의 발견 - 메모 서비스를 생각하다 MoA 2013.08.17 314
77 Site 윈도우 8 앱 개발 동영상 강의 Naya 2012.09.10 313
76 Graphic Direct3D 9 compile MoA 2013.07.28 313
75 Site 이미지공학(IE) 연구실 MoA 2013.07.28 306
74 Site IT 세미나 유튜브 동영상 Naya 2012.09.10 294
73 Site 프로그래밍 관련 사이트 MoA 2012.08.02 292
72 Site Start Something! - Windows 8 개발 공식 사이트 Naya 2012.08.02 288
71 Tool/etc 에디트 플러스, VS 2008 컴파일 환경 설정 너울 2012.04.02 272
70 Web 카카오톡 웹버전 만들기 OBG 2022.11.09 255
69 Deeplearning 추천(Recommendation) 시스템 - 알고리즘 Trend 정리 OBG 2021.08.03 235
68 Deeplearning RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED ... OBG 2022.09.06 211
Board Pagination Prev 1 ... 6 7 8 9 10 11 12 13 14 15 Next
/ 15