base64 编码 在websocket协议中的应用
一 、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 <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/binary_from_base64.hpp>
#include <boost/archive/iterators/transform_width.hpp>
#include <string>
#include <iostream>
#include <sstream>
#include "base64_1.h"
using namespace std;
using namespace boost::archive::iterators;bool Base64Encode(const string & input, string * output)
{typedef base64_from_binary<transform_width<string::const_iterator, 6, 8>> Base64EncodeIterator;stringstream result;try {copy(Base64EncodeIterator(input.begin()), Base64EncodeIterator(input.end()), ostream_iterator<char>(result));}catch (...) {return false;}size_t equal_count = (3 - input.length() % 3) % 3;for (size_t i = 0; i < equal_count; i++){result.put('=');}*output = result.str();return output->empty() == false;
}bool Base64Decode(const string & input, string * output)
{typedef transform_width<binary_from_base64<string::const_iterator>, 8, 6> Base64DecodeIterator;stringstream result;try {copy(Base64DecodeIterator(input.begin()), Base64DecodeIterator(input.end()), ostream_iterator<char>(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 < (int)(DataByte / 3); i++){tmp[1] = *Data++;tmp[2] = *Data++;tmp[3] = *Data++;str_encode += EncodeTable[tmp[1] >> 2];str_encode += EncodeTable[((tmp[1] << 4) | (tmp[2] >> 4)) & 0x3F];str_encode += EncodeTable[((tmp[2] << 2) | (tmp[3] >> 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) << 4)];str_encode += "==";}else if (mod == 2){tmp[1] = *Data++;tmp[2] = *Data++;str_encode += EncodeTable[(tmp[1] & 0xFC) >> 2];str_encode += EncodeTable[((tmp[1] & 0x03) << 4) | ((tmp[2] & 0xF0) >> 4)];str_encode += EncodeTable[((tmp[2] & 0x0F) << 2)];str_encode += "=";}return str_encode;
}
base64 编解码 base64编解码cpp文件 提供下载
base64 编码 在websocket协议中的应用相关推荐
- java中base64编码加密和android中base64编码加密不一样?base64编码解析错误?
在android的base64加密后得到: WwogIHsKICAgICJ0MSI6ICIwIiwKICAgICJ0MiI6ICIyNDM4NCIsCiAgICAidDMiOiAiIiwKICAgIC ...
- java chunked编码解码_HTTP协议中的CHUNKED编码解析
HTTP协议中的TRANFER-ENCODING:CHUNKED编码解析 通常情况下,Transfer-Encoding域的值应当为chunked,表明采用chunked编码方式来进行报文体的传输.c ...
- 理解WebSocket协议中控制帧:close、ping、pong
控制帧 控制帧用于WebSocket协议交换状态信息,控制帧可以插在消息片段之间. 所有的控制帧的负载长度均不大于125字节,并且禁止对控制帧进行分片处理. 目前控制帧的操作码定义了oxo8(关闭帧) ...
- websocket协议中获取 http 请求字符串
得到http协议首部字节示例 目的 根据RFC6455 文档 制作websocket server过程中,常常要得到首部url字符串,以便知道路由到哪里,参数是什么 http 请求字符串 格式 GET ...
- base64编码 springboot_解决idea中Springboot找不到BASE64Encoder或Decoder的jar包
解决idea中Springboot找不到BASE64Encoder或Decoder的jar包 问题描述: Springboot项目.明明都把包下载放进去了,就是报错找不到.JDK11 解决方法之一: ...
- Websocket协议原理及Ws服务器代码实现
一.什么是 WebSocket WebSocket 是 HTML5 开始提供的一种,建立在单个 TCP 连接上的全双工的网络通信协议.WebSocket 协议在2008年诞生,2011年成为国际标准. ...
- websocket协议以及在gin中的应用
目录 websocket协议简介 WebSocket 协议的来源 短轮询 本质 实现 应用场景 优缺点 长轮询 本质 实现 应用场景 优缺点 WebSocket协议 websocket定义及与HTPP ...
- WebSocket 协议
1.1 背景知识 由于历史原因,在创建一个具有双向通信机制的 web 应用程序时,需要利用到 HTTP 轮询的方式.围绕轮询产生了 "短轮询" 和 "长轮询". ...
- WebScoket 规范 + WebSocket 协议
WebSocket握手协议 1.客户端握手请求(注意:键值之间有一个空格,行间有换行符号0x13x10或者说\r\n) GET /WebSocket/LiveVideo HTTP/1.1 Upgrad ...
最新文章
- GitHub代码一键转VS Code:只需+1s
- hibernate之生成的和默认的属性值(使用generated刷新实体) .
- 3.15 排列对称串
- 计算机的服务如何还原,电脑怎么样还原到出厂设置
- 便利蜂发布双11战报:当天外卖订单最多的是这个城市
- android 底部弹窗失效,Android实现从底部弹出Dialog(和PopWindow实现的效果同样)
- 编程练习赛11B 物品价值(装压dp)
- hdu-5754 Life Winner Bo(博弈)
- 解决Spring Boot启动项目Tomcat不能访问80端口的问题
- win10通过VMware使用教程
- itunes store服务中断_Apple目前正在经历App Store iTunes Store和Mac App Store的中断
- 如何查看声卡、pcm设备以及tinyplay、tinymix、tinycap的使用
- 浅谈车载控制器产线EOL实现方式
- Google设置应用专用密码
- Excel妙用-公式结果我都要
- 2022-2028全球全盘加密软件行业调研及趋势分析报告
- 网页设计课设【登录注册系统及增删改查】
- 编写Shell脚本实现用户管理
- 【OpenCV-Python】 直方图均衡化
- android开机调用搜狗输入法
热门文章
- springboot- jsp访问404的问题解决
- 计算机网络8832,2021年4月份自学考试计算机网络原理04741答案.doc
- 不错的向上滚动广告代码
- 工信部:“5G+工业互联网”在建项目全国已超2000余个
- 华为鸿蒙平板MatePad Pro 2支持多屏协同突破
- Redmi Note 10配备NFC 3.0功能:首次支持封闭式门卡
- 库克:iPhone 12更新换代用户数达到顶峰
- 库克发文纪念苹果成立45周年:伟大使命还有待实现
- 最不靠谱CEO,一句话让公司损失上千亿元
- 苹果悬赏100万美元找漏洞 辞职的理由找到了!