로그인

검색

C/C++
2012.11.15 16:09

C++에서 base64로 인코딩

조회 수 14694 추천 수 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 117642
311 Agent 코딩 에이전트 만드는 법 OBG 2025.08.28 8613
310 Agent Vibe Code an MVP Web App OBG 2025.08.28 8113
309 Deeplearning I Want Everything Local — Building My Offline AI Workspace OBG 2025.08.28 20260
308 Agent Kimi K2 클로드 코드와 함께 사용하는 방법 OBG 2025.08.28 8271
307 LLM Build a Small Language Model (SLM) From Scratch OBG 2025.08.16 20785
306 LLM OpenAI의 새로운 오픈소스 모델은 사실상 Phi-5임 OBG 2025.08.12 9372
305 LLM ChatGPT가 7억 명을 서비스할 수 있는데, 나는 왜 GPT-4 하나도 로컬에서 못 돌릴까? OBG 2025.08.12 9570
304 Omarchy, DHH가 만든 Linux 배포판 OBG 2025.08.12 7908
303 LLM OpenAI의 gpt‑oss‑120b, gpt‑oss‑20b: 개인 컴퓨터에서 ChatGPT 사용? OBG 2025.08.12 10182
302 LLM AI가 만든 코드, 결국엔 모두 레거시가 된다? OBG 2025.08.12 9679
301 모던 Node.js 패턴 (2025) OBG 2025.08.07 5830
300 Deeplearning AI 발전을 따라잡는 나만의 방법 (그리고 당신도 꼭 해야 하는 이유) OBG 2025.08.07 10271
299 Web JSON.stringify를 두 배 이상 빠르게 만든 방법 OBG 2025.08.07 8256
298 Tool/etc OS 개발에 관한 작은 책 OBG 2025.03.24 12150
297 LLM 알리바바, 딥시크·오픈AI 넘는 추론 모델 출시..."오픈 소스 최강 입증" (QwQ-32B) OBG 2025.03.10 11046
296 Site 2024년 가장 조회수 높은 소프트웨어 엔지니어링 발표들 OBG 2025.02.18 10229
295 Deeplearning 존 카맥이 일리야 수츠키버를 4년전에 만났을때, 추천받은 책과 논문 목록 OBG 2025.02.18 10868
294 Tool/etc 나이 들어가는 프로그래머 - [발표영상] 요약 OBG 2025.02.14 11767
293 Tool/etc GitHut Copilot - Agent 모드 공개 OBG 2025.02.14 23503
292 Tool/etc GDB Dashboard OBG 2025.01.14 23907
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 18 Next
/ 18