// Base64EnDe.cpp : アプリケーションのエントリ ポイントを定義します。
//
#include <iostream>
#include <string>
#include <vector>
#include <cstdint>
#include <tuple>
typedef std::vector<std::uint8_t> DType;
const std::string Token = "ABCDEFGHIJKLNMOPQRSTUVWXYZabcdefghijklnmopqrstuvwxyz0123456789+/";
const std::string Pad = "=";
std::string Base64Enc(const std::string& s) {
std::uint64_t V1 = 0;
std::uint64_t V2 = 0;
std::uint64_t P = 0;
DType D;
std::string R;
for (std::size_t i = 0; i < s.size(); i++) {
V1 = s[i];
i++;
P = (V1 >> 2) & 0x3f;
D.push_back(P);
V1 &= 3;
V2 = s[i];
i++;
P = ((V1 << 4) & 0x3f) | ((V2 >> 4) & 0x3f);
D.push_back(P);
V1 = V2 - ((V2 >> 4) << 4);
V2 = s[i];
i++;
P = ((V1 << 2) & 0x3f) | ((V2 >> 6) & 0x3f);
D.push_back(P);
V1 = V2 - ((V2 >> 6) << 6);
P = V1 & 0x3f;
D.push_back(P);
}
for (auto& o : D) {
R += Token[o];
}
for (std::size_t i = 0; i < 4 - (R.size() % 4); i++) {
R += Pad;
}
return R;
}
int main()
{
std::string S;
S = Base64Enc("ABCDEFG");
std::cout << S << std::endl;
return 0;
}
Ly8gQmFzZTY0RW5EZS5jcHAgOiDjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7Pjga7jgqjjg7Pjg4jjg6og44Od44Kk44Oz44OI44KS5a6a576p44GX44G+44GZ44CCCi8vCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGNzdGRpbnQ+CiNpbmNsdWRlIDx0dXBsZT4KCgp0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6dWludDhfdD4gRFR5cGU7CmNvbnN0IHN0ZDo6c3RyaW5nIFRva2VuID0gIkFCQ0RFRkdISUpLTE5NT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbm1vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwpjb25zdCBzdGQ6OnN0cmluZyBQYWQgPSAiPSI7CgoKCnN0ZDo6c3RyaW5nIEJhc2U2NEVuYyhjb25zdCBzdGQ6OnN0cmluZyYgcykgewoJc3RkOjp1aW50NjRfdCBWMSA9IDA7CglzdGQ6OnVpbnQ2NF90IFYyID0gMDsKCXN0ZDo6dWludDY0X3QgUCA9IDA7CglEVHlwZSBEOwoJc3RkOjpzdHJpbmcgUjsKCgoJZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHMuc2l6ZSgpOyBpKyspIHsKCgkJVjEgPSBzW2ldOwoJCWkrKzsKCgoJCVAgPSAoVjEgPj4gMikgJiAweDNmOwoJCUQucHVzaF9iYWNrKFApOwoJCVYxICY9IDM7CgoJCVYyID0gc1tpXTsKCQlpKys7CgoJCVAgPSAoKFYxIDw8IDQpICYgMHgzZikgfCAoKFYyID4+IDQpICYgMHgzZik7CgkJRC5wdXNoX2JhY2soUCk7CgkJVjEgPSBWMiAtICgoVjIgPj4gNCkgPDwgNCk7CgoJCVYyID0gc1tpXTsKCQlpKys7CgoJCVAgPSAoKFYxIDw8IDIpICYgMHgzZikgfCAoKFYyID4+IDYpICYgMHgzZik7CgkJRC5wdXNoX2JhY2soUCk7CgkJVjEgPSBWMiAtICgoVjIgPj4gNikgPDwgNik7CgoJCVAgPSBWMSAmIDB4M2Y7CgkJRC5wdXNoX2JhY2soUCk7Cgl9CgoJZm9yIChhdXRvJiBvIDogRCkgewoJCVIgKz0gVG9rZW5bb107Cgl9Cglmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgNCAtIChSLnNpemUoKSAlIDQpOyBpKyspIHsKCQlSICs9IFBhZDsKCX0KCglyZXR1cm4gUjsKfQoKCmludCBtYWluKCkKewoJc3RkOjpzdHJpbmcgUzsKCglTID0gQmFzZTY0RW5jKCJBQkNERUZHIik7CglzdGQ6OmNvdXQgPDwgUyA8PCBzdGQ6OmVuZGw7CiAgICByZXR1cm4gMDsKfQo=