您当前的位置: 首页 >  websocket

qianbo_insist

暂无认证

  • 0浏览

    0关注

    399博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

base64 编码 在websocket协议中的应用

qianbo_insist 发布时间:2021-02-14 19:46:34 ,浏览量:0

一 、base64作用

1、参数传输的过程中使用 2、传输二进制图片,可以将字符直接插入页面中 3、基于64个可打印的字符转换表示二进制的数据

二、缺陷

1、明显会增长数据的量,尤其是图片转化,增长三分之一左右,这个量其实不小了

三、代码 show me the code

我们知道websocket协议建立在http协议基础之上,实现websocket协议前面要实现一段http协议代码,然后upgrade,在websocket协议中,RFC6455 文档使用base64 将摘要二进制编码成二十个字符,插入http协议中加载在magic字符串 “258EAFA5-E914-47DA-95CA-C5AB0DC85B11” 之前。对端传输过来后,取出进行sha1算法转换,取出5个字节字节摘要后计算base64的二十个字符,重新传输回对端。对端可验证摘要,也可以不验证,当然,浏览器肯定会验证算法,摘要认证和重放保护等安全性更多体现在https 和 wss 上,所以这个自行做的websocket客户端可以不进行验证。

3.1 使用boost

在制作websoket server的时候,使用了boost的asio库,因此直接使用boost库,不使用boost库的制作者可以跳过直接到3.2小节。

#include 
#include 
#include 
#include 
#include 
#include 
#include "base64_1.h"
using namespace std;
using namespace boost::archive::iterators;

bool Base64Encode(const string & input, string * output)
{
	typedef base64_from_binary Base64EncodeIterator;
	stringstream result;
	try {
		copy(Base64EncodeIterator(input.begin()), Base64EncodeIterator(input.end()), ostream_iterator(result));
	}
	catch (...) {
		return false;
	}
	size_t equal_count = (3 - input.length() % 3) % 3;
	for (size_t i = 0; i empty() == false;
}

bool Base64Decode(const string & input, string * output)
{
	typedef transform_width Base64DecodeIterator;
	stringstream result;
	try {
		copy(Base64DecodeIterator(input.begin()), Base64DecodeIterator(input.end()), ostream_iterator(result));
	}
	catch (...) {
		return false;
	}
	*output = result.str();
	return output->empty() == false;
}
3.2 不使用boost

这样可以,少一些依赖,不用为了一个base64,就引入一个boost库。

const std::string encode(const unsigned char* Data, int DataByte)
{
	//编码表  
	const char EncodeTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	//返回值  
	std::string str_encode;
	unsigned char tmp[4] = { 0 };
	int line_length = 0;
	for (int i = 0; i > 2];
		str_encode += EncodeTable[((tmp[1]  4)) & 0x3F];
		str_encode += EncodeTable[((tmp[2]  6)) & 0x3F];
		str_encode += EncodeTable[tmp[3] & 0x3F];
		if (line_length += 4, line_length == 76)
		{
			str_encode += "\r\n";
			line_length = 0;
		}
	}
	//对剩余数据进行编码  
	int mod = DataByte % 3;
	if (mod == 1)
	{
		tmp[1] = *Data++;
		str_encode += EncodeTable[(tmp[1] & 0xFC) >> 2];
		str_encode += EncodeTable[((tmp[1] & 0x03)  2];
		str_encode += EncodeTable[((tmp[1] & 0x03)  4)];
		str_encode += EncodeTable[((tmp[2] & 0x0F)             
关注
打赏
1663161521
查看更多评论
0.0401s