一 、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)
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?