예제 #1
0
	//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() );
}