BLC 사용 예제 - BASE64 인코딩/디코딩
BLC 라이브러리 다운로드
입력받은 문자열을 BASE64로 인코딩한 결과와, 그것을 다시 디코딩한 결과를 화면에 출력해주는 예제 코드입니다.
예제용으로 작성한 코드라 효율성 같은것은 고려하지 않고 작성하였습니다.
예제 코드 보기
- #include
- #include
- #include
-
- #include
- #include
- #include
- #include
-
- using BASE64TableT = blc::bimap::BidirectionalMap<
- uint8_t, uint8_t, blc::bimap::ContainerUnorderedMap
- >;
-
- const BASE64TableT kBASE64Table = {
- { 0, 'A' },
- { 1, 'B' },
- { 2, 'C' },
- { 3, 'D' },
- { 4, 'E' },
- { 5, 'F' },
- { 6, 'G' },
- { 7, 'H' },
- { 8, 'I' },
- { 9, 'J' },
- { 10, 'K' },
- { 11, 'L' },
- { 12, 'M' },
- { 13, 'N' },
- { 14, 'O' },
- { 15, 'P' },
- { 16, 'Q' },
- { 17, 'R' },
- { 18, 'S' },
- { 19, 'T' },
- { 20, 'U' },
- { 21, 'V' },
- { 22, 'W' },
- { 23, 'X' },
- { 24, 'Y' },
- { 25, 'Z' },
- { 26, 'a' },
- { 27, 'b' },
- { 28, 'c' },
- { 29, 'd' },
- { 30, 'e' },
- { 31, 'f' },
- { 32, 'g' },
- { 33, 'h' },
- { 34, 'i' },
- { 35, 'j' },
- { 36, 'k' },
- { 37, 'l' },
- { 38, 'm' },
- { 39, 'n' },
- { 40, 'o' },
- { 41, 'p' },
- { 42, 'q' },
- { 43, 'r' },
- { 44, 's' },
- { 45, 't' },
- { 46, 'u' },
- { 47, 'v' },
- { 48, 'w' },
- { 49, 'x' },
- { 50, 'y' },
- { 51, 'z' },
- { 52, '0' },
- { 53, '1' },
- { 54, '2' },
- { 55, '3' },
- { 56, '4' },
- { 57, '5' },
- { 58, '6' },
- { 59, '7' },
- { 60, '8' },
- { 61, '9' },
- { 62, '+' },
- { 63, '/' },
- };
-
- std::string BASE64Encode(const void* data, size_t size)
- {
- using namespace std;
- using namespace blc::bit;
-
- string result;
- ConstBitPtr src(data);
- uint8_t buffer = 0;
- const BitPtr dst(&buffer);
-
- result.reserve(size * 4 / 3 + 1);
- for (; size >= 1; src += 24) {
-
- {
- BitMove(dst, src + 2, 6);
- result += *kBASE64Table.FirstToSecond(buffer);
- BitMove(dst + 4, src, 2);
- }
- if (size >= 2) {
- {
- BitMove(dst, src + 12, 4);
- result += *kBASE64Table.FirstToSecond(buffer);
- BitMove(dst + 2, src + 8, 4);
- }
- if (size >= 3) {
- BitMove(dst, src + 22, 2);
- result += *kBASE64Table.FirstToSecond(buffer);
-
- BitMove(dst, src + 16, 6);
- result += *kBASE64Table.FirstToSecond(buffer);
- size -= 3;
- }
- else {
- BitSet(dst, false, 2);
- result += *kBASE64Table.FirstToSecond(buffer);
- result += '=';
- size -= 2;
- }
- }
- else {
- BitSet(dst, false, 4);
- result += *kBASE64Table.FirstToSecond(buffer);
- result += "==";
- --size;
- }
- }
-
- return result;
- }
-
- std::vector<uint8_t> BASE64Decode(const std::string& BASE64)
- {
- using namespace std;
- using namespace blc::bit;
-
- size_t size = BASE64.size();
-
- if ((size & 3) || !size) return {};
-
-
- vector<uint8_t> result(size * 3 / 4, 0);
- BitPtr dst(&result[0]);
-
- for (size_t i = 0; i < size; dst += 24) {
-
-
- ConstBitPtr src(kBASE64Table.SecondToFirst(BASE64[i++]));
- if (!src) return {};
- BitMove(dst + 2, src, 6);
-
- src.set_const_base_ptr(kBASE64Table.SecondToFirst(BASE64[i++]));
- if (!src) return {};
- BitMove(dst, src + 4, 2);
-
-
- if (BASE64[i] != '=') {
-
-
- BitMove(dst + 12, src, 4);
-
- src.set_const_base_ptr(kBASE64Table.SecondToFirst(BASE64[i++]));
- if (!src) return {};
- BitMove(dst + 8, src + 2, 4);
-
-
- if (BASE64[i] != '=') {
-
- BitMove(dst + 22, src, 2);
-
- src.set_const_base_ptr(kBASE64Table.SecondToFirst(BASE64[i++]));
- if (!src) return {};
- BitMove(dst + 16, src, 6);
- }
- else {
-
- ++i;
- result.resize(result.size() - 1);
- }
- }
- else {
-
- i += 2;
- result.resize(result.size() - 2);
- }
- }
-
- return result;
- }
-
- int main()
- {
- using namespace blc::console;
- using namespace blc::ustr;
- using namespace std;
-
- SetCharacterWidthFunc(mk_wcwidth_cjk);
-
-
- ConsoleWindow::SetTitle(L"BASE64 인코딩/디코딩 예제"s);
-
- auto str = u8""s;
- ConsoleWindow::Space space(0, 0, 60, 1);
-
- cout << u8"입력한 문자열을 BASE64로 인코딩/디코딩 합니다."s << endl << endl;
- space.set_y(ConsoleWindow::WhereY());
-
- ConsoleWindow::ModifyStr(str, space);
- cout << endl << endl;
-
- auto base64 = BASE64Encode(str.c_str(), str.size());
-
- cout << u8">>BASE64 인코딩 결과:"s << endl;
- cout << base64 << endl << endl;
-
- auto buffer = BASE64Decode(base64);
-
- cout << u8">>BASE64 디코딩 결과:"s << endl;
- cout << string(buffer.cbegin(), buffer.cend()) << endl << endl;
-
- return 0;
- }
예제 코드 접기
실행 결과
