diff options
-rw-r--r-- | base64.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
@@ -6,7 +6,7 @@ using namespace std; namespace Base64{ char alphabet[65]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - uint8_t revbet[128]={ + uint8_t revbet[128]={ //reverse look-up table of `alphabet` (for decoding) #define XX (127) XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX, //0-15 XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX, //16-31 @@ -19,6 +19,8 @@ namespace Base64{ #undef XX }; + //This is the standard base64 algorithm; most of the code deals with correct padding, actually. + //There are a lot of magic numbers here, but they should be obvious regarding the algorithm. string encode(const string &data){ int sz=data.size(); if(sz==0)return {}; @@ -50,24 +52,25 @@ namespace Base64{ return res; } + //The inverse of `encode`. string decode(const string &dataS){ int szS=dataS.size(); if(szS==0)return {}; uint8_t data[szS]; int sz=0; - for(char c : dataS){ + for(char c : dataS){ //First filter away all non-base64 characters (probably mostly newlines, if any) if(revbet[c&0x7f]!=127)data[sz++]=revbet[c&0x7f]; } int blocks=sz/4; int endlen; - if(sz%4==0){ + if(sz%4==0){ //Detect padding; tries to be nice and forgive bad padding if(data[sz-1]=='='){ blocks--; if(data[sz-2]=='=')endlen=1; else endlen=2; } else endlen=0; - } else endlen=sz%4-1; + } else endlen=sz%4-1; //padding not present... assume the data is OK sort-of? string res(3*blocks+endlen,'\0'); int x; for(int i=0;i<blocks;i++){ |