Added Base64Decode

git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@403 726aef4b-f618-498e-8847-2d620e286838
This commit is contained in:
prozacx
2005-07-01 23:50:22 +00:00
parent 878c5d5a2b
commit 98378cd86b
2 changed files with 73 additions and 10 deletions
+44 -5
View File
@@ -92,7 +92,7 @@ CString CString::AsLower() const {
return sRet; return sRet;
} }
CString CString::Escape_n(EEscape eFrom, EEscape eTo) { CString CString::Escape_n(EEscape eFrom, EEscape eTo) const {
CString sRet; CString sRet;
const char szHex[] = "0123456789ABCDEF"; const char szHex[] = "0123456789ABCDEF";
const unsigned char *pStart = (const unsigned char*) data(); const unsigned char *pStart = (const unsigned char*) data();
@@ -103,6 +103,7 @@ CString CString::Escape_n(EEscape eFrom, EEscape eTo) {
for (unsigned int a = 0; a < iLength; a++, p = pStart + a) { for (unsigned int a = 0; a < iLength; a++, p = pStart + a) {
switch (eFrom) { switch (eFrom) {
case EHTML:
case EAscii: case EAscii:
ch = *p; ch = *p;
break; break;
@@ -133,6 +134,7 @@ CString CString::Escape_n(EEscape eFrom, EEscape eTo) {
} }
switch (eTo) { switch (eTo) {
case EHTML:
case EAscii: case EAscii:
sRet += ch; sRet += ch;
break; break;
@@ -155,8 +157,8 @@ CString CString::Escape_n(EEscape eFrom, EEscape eTo) {
return sRet; return sRet;
} }
CString CString::Escape_n(EEscape eTo) { CString CString::Escape_n(EEscape eTo) const {
return Escape(EAscii, eTo); return Escape_n(EAscii, eTo);
} }
CString& CString::Escape(EEscape eFrom, EEscape eTo) { CString& CString::Escape(EEscape eFrom, EEscape eTo) {
@@ -246,13 +248,13 @@ CString CString::Right(unsigned int uCount) const {
return substr(length() - uCount, uCount); return substr(length() - uCount, uCount);
} }
VCString CString::Split(const CString& sDelim, bool bAllowEmpty) { VCString CString::Split(const CString& sDelim, bool bAllowEmpty) const {
VCString vsRet; VCString vsRet;
Split(sDelim, vsRet, bAllowEmpty); Split(sDelim, vsRet, bAllowEmpty);
return vsRet; return vsRet;
} }
unsigned int CString::Split(const CString& sDelim, VCString& vsRet, bool bAllowEmpty) { unsigned int CString::Split(const CString& sDelim, VCString& vsRet, bool bAllowEmpty) const {
vsRet.empty(); vsRet.empty();
CString sTmp = *this; CString sTmp = *this;
@@ -278,6 +280,43 @@ CString CString::Format(const CString& sFormatStr, ...) {
return ""; return "";
} }
unsigned long CString::Base64Decode(CString& sRet) const {
const char* in = c_str();
char c, c1, *p;
unsigned long i;
unsigned long uLen = size();
char* out = (char*) malloc(size() +1);
for (i = 0, p = out; i < uLen; i++) {
c = (char)base64_table[(unsigned char)in[i++]];
c1 = (char)base64_table[(unsigned char)in[i++]];
*p++ = (c << 2) | ((c1 >> 4) & 0x3);
if (i < uLen) {
if (in[i] == '=') {
break;
}
c = (char)base64_table[(unsigned char)in[i]];
*p++ = ((c1 << 4) & 0xf0) | ((c >> 2) & 0xf);
}
if (++i < uLen) {
if (in[i] == '=') {
break;
}
*p++ = ((c << 6) & 0xc0) | (char)base64_table[(unsigned char)in[i]];
}
}
*p = '\0';
unsigned long uRet = p - out;
sRet = out;
free(out);
return uRet;
}
CString CString::ToString(char c) { stringstream s; s << c; return s.str(); } CString CString::ToString(char c) { stringstream s; s << c; return s.str(); }
CString CString::ToString(unsigned char c) { stringstream s; s << c; return s.str(); } CString CString::ToString(unsigned char c) { stringstream s; s << c; return s.str(); }
CString CString::ToString(short i) { stringstream s; s << i; return s.str(); } CString CString::ToString(short i) { stringstream s; s << i; return s.str(); }
+29 -5
View File
@@ -14,11 +14,32 @@ using std::stringstream;
class CString; class CString;
typedef vector<CString> VCString; typedef vector<CString> VCString;
static const unsigned char XX = 0xff;
static const unsigned char base64_table[256] = {
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,62, XX,XX,XX,63,
52,53,54,55, 56,57,58,59, 60,61,XX,XX, XX,XX,XX,XX,
XX, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
15,16,17,18, 19,20,21,22, 23,24,25,XX, XX,XX,XX,XX,
XX,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
41,42,43,44, 45,46,47,48, 49,50,51,XX, XX,XX,XX,XX,
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
};
class CString : public string { class CString : public string {
public: public:
typedef enum { typedef enum {
EAscii, EAscii,
EURL, EURL,
EHTML,
} EEscape; } EEscape;
CString() : string() {} CString() : string() {}
@@ -36,20 +57,23 @@ public:
CString AsUpper() const; CString AsUpper() const;
CString AsLower() const; CString AsLower() const;
CString Escape_n(EEscape eFrom, EEscape eTo); CString Escape_n(EEscape eFrom, EEscape eTo) const;
CString Escape_n(EEscape eTo); CString Escape_n(EEscape eTo) const;
CString& Escape(EEscape eFrom, EEscape eTo); CString& Escape(EEscape eFrom, EEscape eTo);
CString& Escape(EEscape eTo); CString& Escape(EEscape eTo);
static unsigned int Replace(CString& sStr, const CString& sReplace, const CString& sWith); static unsigned int Replace(CString& sStr, const CString& sReplace, const CString& sWith);
unsigned int Replace(const CString& sReplace, const CString& sWith); unsigned int Replace(const CString& sReplace, const CString& sWith);
CString Token(unsigned int uPos, bool bRest = false, const CString& sSep = " ") const;
CString Ellipsize(unsigned int uLen) const; CString Ellipsize(unsigned int uLen) const;
CString Left(unsigned int uCount) const; CString Left(unsigned int uCount) const;
CString Right(unsigned int uCount) const; CString Right(unsigned int uCount) const;
VCString Split(const CString& sDelim, bool bKeepEmpty = true);
unsigned int Split(const CString& sDelim, VCString& vsRet, bool bAllowEmpty = true); CString Token(unsigned int uPos, bool bRest = false, const CString& sSep = " ") const;
VCString Split(const CString& sDelim, bool bKeepEmpty = true) const;
unsigned int Split(const CString& sDelim, VCString& vsRet, bool bAllowEmpty = true) const;
static CString Format(const CString& sFormatStr, ...); static CString Format(const CString& sFormatStr, ...);
unsigned long Base64Decode(CString& sRet) const;
static CString ToString(char c); static CString ToString(char c);
static CString ToString(unsigned char c); static CString ToString(unsigned char c);