26 std::string
Base64Encode (
const uint8_t* aData,
size_t aDataSize,
bool aSplit )
31 result.reserve ( ( ( aDataSize + 2 ) / 3 ) * 4 );
32 for (
size_t i = 0; i < aDataSize / 3; ++i )
34 uint32_t n = ( aData[i * 3] << 16 ) + ( aData[ ( i * 3 ) + 1] << 8 ) + aData[ ( i * 3 ) + 2];
35 result.push_back ( Alphabeth[ ( n >> 18 ) & 63] );
36 result.push_back ( Alphabeth[ ( n >> 12 ) & 63] );
37 result.push_back ( Alphabeth[ ( n >> 6 ) & 63] );
38 result.push_back ( Alphabeth[n & 63] );
39 if ( aSplit && ! ( ( i + 1 ) % 19 ) )
41 result.push_back (
'\n' );
44 switch ( aDataSize % 3 )
48 uint32_t n = ( aData[aDataSize - 1] << 16 );
49 result.push_back ( Alphabeth[ ( n >> 18 ) & 63] );
50 result.push_back ( Alphabeth[ ( n >> 12 ) & 63] );
51 result.push_back ( Padding );
52 result.push_back ( Padding );
57 uint32_t n = ( aData[aDataSize - 2] << 16 ) + ( aData[aDataSize - 1] << 8 );
58 result.push_back ( Alphabeth[ ( n >> 18 ) & 63] );
59 result.push_back ( Alphabeth[ ( n >> 12 ) & 63] );
60 result.push_back ( Alphabeth[ ( n >> 6 ) & 63] );
61 result.push_back ( Padding );
68 std::string
Base64Decode (
const uint8_t* aData,
size_t aDataSize )
73 result.reserve ( ( aDataSize / 4 ) * 3 );
76 for (
size_t i = 0; i < aDataSize; ++i )
78 if ( i > aDataSize - 2 && aData[i] == Padding )
80 block[occupancy++] = 0;
83 block[occupancy] = Alphabeth.find ( aData[i] );
84 if ( block[occupancy] != std::string::npos )
90 size_t n = ( block[0] << 18 ) + ( block[1] << 12 ) + ( block[2] << 6 ) + ( block[3] );
91 result.push_back ( ( n >> 16 ) & 0xFF );
92 result.push_back ( ( n >> 8 ) & 0xFF );
93 result.push_back ( n & 0xFF );