From dd02bc1c443d74ef7eba0c653ae303d70e9e6b5b Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Sat, 11 Apr 2020 12:04:10 +0300 Subject: [PATCH] Add base64 implementation --- Makefile | 5 ++++- base64.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ base64.h | 5 +++++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 base64.cpp create mode 100644 base64.h diff --git a/Makefile b/Makefile index dc903769..9afd6587 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,10 @@ libblockstore.so: $(BLOCKSTORE_OBJS) libfio_blockstore.so: ./libblockstore.so fio_engine.cpp json11.o g++ $(CXXFLAGS) -shared -o libfio_blockstore.so fio_engine.cpp json11.o ./libblockstore.so -ltcmalloc_minimal -luring -OSD_OBJS := osd.o osd_secondary.o osd_receive.o osd_send.o osd_peering.o osd_flush.o osd_peering_pg.o osd_primary.o osd_cluster.o osd_rmw.o json11.o timerfd_interval.o +OSD_OBJS := osd.o osd_secondary.o osd_receive.o osd_send.o osd_peering.o osd_flush.o osd_peering_pg.o \ + osd_primary.o osd_cluster.o osd_rmw.o json11.o timerfd_interval.o base64.o +base64.o: base64.cpp base64.h + g++ $(CXXFLAGS) -c -o $@ $< osd_secondary.o: osd_secondary.cpp osd.h osd_ops.h ringloop.h g++ $(CXXFLAGS) -c -o $@ $< osd_receive.o: osd_receive.cpp osd.h osd_ops.h ringloop.h diff --git a/base64.cpp b/base64.cpp new file mode 100644 index 00000000..79546452 --- /dev/null +++ b/base64.cpp @@ -0,0 +1,50 @@ +#include "base64.h" + +std::string base64_encode(const std::string &in) +{ + std::string out; + unsigned val = 0, valb = -6; + for (unsigned char c: in) + { + val = (val<<8) + c; + valb += 8; + while (valb >= 0) + { + out.push_back("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(val>>valb) & 0x3F]); + valb -= 6; + } + } + if (valb > -6) + out.push_back("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[((val<<8)>>(valb+8)) & 0x3F]); + while (out.size() % 4) + out.push_back('='); + return out; +} + +static char T[256] = { 0 }; + +std::string base64_decode(const std::string &in) +{ + std::string out; + if (T[0] == 0) + { + for (int i = 0; i < 256; i++) + T[i] = -1; + for (int i = 0; i < 64; i++) + T[(unsigned char)("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[i])] = i; + } + unsigned val = 0, valb = -8; + for (unsigned char c: in) + { + if (T[c] == -1) + break; + val = (val<<6) + T[c]; + valb += 6; + if (valb>=0) + { + out.push_back(char((val>>valb)&0xFF)); + valb -= 8; + } + } + return out; +} diff --git a/base64.h b/base64.h new file mode 100644 index 00000000..a6824b8b --- /dev/null +++ b/base64.h @@ -0,0 +1,5 @@ +#pragma once +#include + +std::string base64_encode(const std::string &in); +std::string base64_decode(const std::string &in);