implement base64_decode()

This commit is contained in:
David Rose 2004-12-08 23:01:15 +00:00
parent a6b259e40d
commit 448e2b73e8
4 changed files with 82 additions and 0 deletions

View File

@ -33,6 +33,9 @@ static const char base64_table[64] = {
'4', '5', '6', '7', '8', '9', '+', '/',
};
static unsigned char base64_invert[128];
static bool got_base64_invert = false;
////////////////////////////////////////////////////////////////////
// Function: HTTPAuthorization::Constructor
// Access: Protected
@ -240,6 +243,56 @@ base64_encode(const string &s) {
return result;
}
////////////////////////////////////////////////////////////////////
// Function: HTTPAuthorization::base64_decode
// Access: Public, Static
// Description: Returns the string decoded from base64.
////////////////////////////////////////////////////////////////////
string HTTPAuthorization::
base64_decode(const string &s) {
// Build up the invert table if this is the first time.
if (!got_base64_invert) {
int i;
for (i = 0; i < 128; i++) {
base64_invert[i] = 0xff;
}
for (int i = 0; i < 64; i++) {
base64_invert[base64_table[i]] = i;
}
base64_invert['='] = 0;
got_base64_invert = true;
}
// Collect the string 4 bytes at a time; decode this back into a
// 24-bit word and output the 3 corresponding bytes.
size_t num_words = s.size() / 4;
string result;
result.reserve(num_words * 3);
size_t p;
for (p = 0; p < s.size(); p += 4) {
unsigned int c0 = base64_invert[s[p] & 0x7f];
unsigned int c1 = base64_invert[s[p + 1] & 0x7f];
unsigned int c2 = base64_invert[s[p + 2] & 0x7f];
unsigned int c3 = base64_invert[s[p + 3] & 0x7f];
unsigned int word =
(c0 << 18) | (c1 << 12) | (c2 << 6) | c3;
result += (char)((word >> 16) & 0xff);
if (s[p + 2] != '=') {
result += (char)((word >> 8) & 0xff);
if (s[p + 3] != '=') {
result += (char)(word & 0xff);
}
}
}
return result;
}
////////////////////////////////////////////////////////////////////
// Function: HTTPAuthorization::scan_quoted_or_unquoted_string
// Access: Protected, Static

View File

@ -67,6 +67,7 @@ public:
const string &field_value);
static URLSpec get_canonical_url(const URLSpec &url);
static string base64_encode(const string &s);
static string base64_decode(const string &s);
protected:
static size_t scan_quoted_or_unquoted_string(string &result,

View File

@ -170,3 +170,28 @@ get_cipher_list() const {
return _cipher_list;
}
////////////////////////////////////////////////////////////////////
// Function: HTTPClient::base64_encode
// Access: Published, Static
// Description: Implements HTTPAuthorization::base64_encode(). This
// is provided here just as a convenient place to
// publish it for access by the scripting language; C++
// code should probably use HTTPAuthorization directly.
////////////////////////////////////////////////////////////////////
INLINE string HTTPClient::
base64_encode(const string &s) {
return HTTPAuthorization::base64_encode(s);
}
////////////////////////////////////////////////////////////////////
// Function: HTTPClient::base64_decode
// Access: Published, Static
// Description: Implements HTTPAuthorization::base64_decode(). This
// is provided here just as a convenient place to
// publish it for access by the scripting language; C++
// code should probably use HTTPAuthorization directly.
////////////////////////////////////////////////////////////////////
INLINE string HTTPClient::
base64_decode(const string &s) {
return HTTPAuthorization::base64_decode(s);
}

View File

@ -125,6 +125,9 @@ PUBLISHED:
PT(HTTPChannel) get_document(const URLSpec &url);
PT(HTTPChannel) get_header(const URLSpec &url);
INLINE static string base64_encode(const string &s);
INLINE static string base64_decode(const string &s);
public:
SSL_CTX *get_ssl_ctx();