로그인

검색

C/C++
2012.11.15 16:09

C++에서 base64로 인코딩

조회 수 10795 추천 수 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 89847
295 Deeplearning 존 카맥이 일리야 수츠키버를 4년전에 만났을때, 추천받은 책과 논문 목록 OBG 2025.02.18 7750
294 Tool/etc 나이 들어가는 프로그래머 - [발표영상] 요약 OBG 2025.02.14 8362
293 Tool/etc GitHut Copilot - Agent 모드 공개 OBG 2025.02.14 17631
292 Tool/etc GDB Dashboard OBG 2025.01.14 17871
291 LLM AI-hub 공공데이터를 활용하여 한국어-영어 번역 LLM 만들기 OBG 2025.01.14 8291
290 Tool/etc OS in 1,000 Lines OBG 2025.01.14 17264
289 LLM 얼렁뚱땅 LLM을 만들어보자 OBG 2025.01.10 8368
288 LLM Comparing Replit and Cursor for AI-Powered Coding OBG 2024.09.21 17218
287 Tool/etc Synology: Top Best Apps For Docker OBG 2024.07.01 17007
286 Graphic ASCII 3D 렌더러 만들기 OBG 2024.06.03 7538
285 LLM Anthropic, LLM의 내부를 이해하는데 있어 상당한 진전을 보임 OBG 2024.06.03 9228
284 LLM llama3 implemented from scratch OBG 2024.05.24 17015
283 Tool/etc HuggingFace 공동창업자가 추천하는 AI 분야 입문 서적 OBG 2024.05.24 9554
282 LLM [VESSL AI] 뉴욕주민의 프로젝트플루토 — LLM, LLMOps를 활용한 금융 미디어의 혁신 OBG 2024.04.21 10207
281 LLM PEFT: Parameter-Efficient Fine-Tuning of Billion-Scale Models on Low-Resource Hardware OBG 2024.04.15 16593
280 LLM The difference between quantization methods for the same bits OBG 2024.04.14 16886
279 LLM Mixture of Experts - Part 2 OBG 2024.04.14 16675
278 LLM ChatGPT의 강력한 경쟁 언어모델 등장!, Mixtral 8x7B OBG 2024.04.14 9355
277 LLM Real-Time Stock News Sentiment Prediction with Python OBG 2024.04.11 16565
276 LLM Getting Started with Sentiment Analysis using Python OBG 2024.04.11 17391
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 17 Next
/ 17