Skip to content

Instantly share code, notes, and snippets.

@eklitzke
Created January 1, 2021 01:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eklitzke/c1d190a84ae552ae64fd6dde065b475d to your computer and use it in GitHub Desktop.
Save eklitzke/c1d190a84ae552ae64fd6dde065b475d to your computer and use it in GitHub Desktop.
std::string EncodeBase64(std::string_view v) {
size_t sz = v.size();
size_t padding = sz % 3;
if (padding) {
padding = 3 - padding;
}
sz += padding;
ASSERT_DEBUG(sz % 3 == 0);
std::string out(sz * 4 / 3, 0);
size_t p = 0;
for (size_t i = 0; i < sz; i += 3) {
uint8_t b = v[i] >> 2;
ASSERT_DEBUG(b < 64);
out[p++] = B64_TABLE[b];
b = ((v[i] & 0x3) << 4) + (v[i + 1] >> 4);
ASSERT_DEBUG(b < 64);
out[p++] = B64_TABLE[b];
b = ((v[i + 1] & 0xf) << 2) + (v[i + 2] >> 6);
ASSERT_DEBUG(b < 64);
out[p++] = B64_TABLE[b];
b = v[i + 2] & 0x3f;
ASSERT_DEBUG(b < 64);
out[p++] = B64_TABLE[b];
}
// add padding bytes
for (size_t i = 0; i < padding; i++) {
out[p++] = '=';
}
ASSERT_DEBUG(p == out.size());
return out;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment