You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
2.4 KiB
73 lines
2.4 KiB
/*--------------------------------------------------------------------------*
|
|
*
|
|
* Microsoft Windows
|
|
* Copyright (C) Microsoft Corporation, 1999 - 1999
|
|
*
|
|
* File: base64.h
|
|
*
|
|
* Contents: Implements encoding / decoding table for base64 format
|
|
*
|
|
* History: 17-Dec-99 audriusz Created
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* class base64_table
|
|
*
|
|
* PURPOSE: Class maintains Base64 conversion templates. It exposes static methods
|
|
* to both encode and decode Base64 data
|
|
*
|
|
* USAGE: call static methods to encode/decode one piece of data (24 bites or less)
|
|
*
|
|
*+-------------------------------------------------------------------------*/
|
|
class base64_table
|
|
{
|
|
protected:
|
|
static BYTE _six2pr64[64];
|
|
static BYTE _pr2six[256];
|
|
public:
|
|
base64_table();
|
|
int decode4(BYTE * src, int nChars, BYTE * dest);
|
|
BYTE map2six(BYTE bt);
|
|
// static functions used for zero terminated LPOLESTR format data only
|
|
static void encode(const BYTE * &src, DWORD &cbInput, LPOLESTR &dest);
|
|
static bool decode(LPCOLESTR &src, BYTE * &dest);
|
|
};
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
*
|
|
* METHOD: base64_table::map2six
|
|
*
|
|
* PURPOSE: maps symbols to 6bit value if smb is valid, 0xff else
|
|
*
|
|
*+-------------------------------------------------------------------------*/
|
|
inline BYTE base64_table::map2six(BYTE bt)
|
|
{
|
|
return (bt > 255 ? 0xff : _pr2six[bt]);
|
|
}
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
*
|
|
* METHOD: base64_table::decode4
|
|
*
|
|
* PURPOSE: glues 3 bytes from stored 6bit values
|
|
*
|
|
* NOTE: gluing is done in place - data pointed by src is destroyed
|
|
*
|
|
*+-------------------------------------------------------------------------*/
|
|
inline int base64_table::decode4(BYTE * src, int nChars, BYTE * dest)
|
|
{
|
|
// glue to form 3 full bytes
|
|
src[0] <<= 2; src[0] |= (src[1] >> 4);
|
|
src[1] <<= 4; src[1] |= (src[2] >> 2);
|
|
src[2] <<= 6; src[2] |= (src[3] );
|
|
|
|
// now store as many bytes as have complete set of bites;
|
|
// int nFull = nChars*6/8; // it actually boils to 0 or nChars - 1, whichever is bigger
|
|
for (int i=0; i< nChars-1; i++)
|
|
*dest++ = src[i];
|
|
|
|
return nChars ? nChars - 1 : 0;
|
|
}
|