//debugged and working properly... do not disturb. string BASE64Encode(const byte_string& input) { string output; const byte* data = input.c_str(); size_t length = input.length(); int value, value2; //handle input in 3 byte blocks while( length > 2 ) { value = data[0]; value >>= 2; output.push_back(Base64EncodeTable[value]); value = data[0]; value2 = data[1]; value &= 0x03; value <<= 4; value2 &= 0xF0; value2 >>= 4; value |= value2; output.push_back(Base64EncodeTable[value]); value = data[1]; value2 = data[2]; value &= 0x0F; value <<= 2; value2 &= 0xC0; value2 >>= 6; value |= value2; output.push_back(Base64EncodeTable[value]); value = data[2]; value &= 0x3F; output.push_back(Base64EncodeTable[value]); data += 3; length -= 3; } //handle remainder switch(length) { case 0: //no remainder to process break; case 1: //process and pad with two = value = data[0]; value >>= 2; output.push_back(Base64EncodeTable[value]); value = data[0]; value &= 0x03; value <<= 4; output.push_back(Base64EncodeTable[value]); output.push_back(Base64EncodeTable[64]); output.push_back(Base64EncodeTable[64]); break; case 2: //process and pad with one = value = data[0]; value >>= 2; output.push_back(Base64EncodeTable[value]); value = data[0]; value2 = data[1]; value &= 0x03; value <<= 4; value2 &= 0xF0; value2 >>= 4; value |= value2; output.push_back(Base64EncodeTable[value]); value = data[1]; value &= 0x0F; value <<= 2; output.push_back(Base64EncodeTable[value]); output.push_back(Base64EncodeTable[64]); break; } return output; }
bool AvHNexus::TunnelToClient::send(const Nexus::ClientID local_id, const byte_string& data) { return AvHNexus::send( VARS(local_id), data.c_str(), data.length() ); }