一 、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协议中的应用相关推荐

  1. java中base64编码加密和android中base64编码加密不一样?base64编码解析错误?

    在android的base64加密后得到: WwogIHsKICAgICJ0MSI6ICIwIiwKICAgICJ0MiI6ICIyNDM4NCIsCiAgICAidDMiOiAiIiwKICAgIC ...

  2. java chunked编码解码_HTTP协议中的CHUNKED编码解析

    HTTP协议中的TRANFER-ENCODING:CHUNKED编码解析 通常情况下,Transfer-Encoding域的值应当为chunked,表明采用chunked编码方式来进行报文体的传输.c ...

  3. 理解WebSocket协议中控制帧:close、ping、pong

    控制帧 控制帧用于WebSocket协议交换状态信息,控制帧可以插在消息片段之间. 所有的控制帧的负载长度均不大于125字节,并且禁止对控制帧进行分片处理. 目前控制帧的操作码定义了oxo8(关闭帧) ...

  4. websocket协议中获取 http 请求字符串

    得到http协议首部字节示例 目的 根据RFC6455 文档 制作websocket server过程中,常常要得到首部url字符串,以便知道路由到哪里,参数是什么 http 请求字符串 格式 GET ...

  5. base64编码 springboot_解决idea中Springboot找不到BASE64Encoder或Decoder的jar包

    解决idea中Springboot找不到BASE64Encoder或Decoder的jar包 问题描述: Springboot项目.明明都把包下载放进去了,就是报错找不到.JDK11 解决方法之一: ...

  6. Websocket协议原理及Ws服务器代码实现

    一.什么是 WebSocket WebSocket 是 HTML5 开始提供的一种,建立在单个 TCP 连接上的全双工的网络通信协议.WebSocket 协议在2008年诞生,2011年成为国际标准. ...

  7. websocket协议以及在gin中的应用

    目录 websocket协议简介 WebSocket 协议的来源 短轮询 本质 实现 应用场景 优缺点 长轮询 本质 实现 应用场景 优缺点 WebSocket协议 websocket定义及与HTPP ...

  8. WebSocket 协议

    1.1 背景知识 由于历史原因,在创建一个具有双向通信机制的 web 应用程序时,需要利用到 HTTP 轮询的方式.围绕轮询产生了 "短轮询" 和 "长轮询". ...

  9. WebScoket 规范 + WebSocket 协议

    WebSocket握手协议 1.客户端握手请求(注意:键值之间有一个空格,行间有换行符号0x13x10或者说\r\n) GET /WebSocket/LiveVideo HTTP/1.1 Upgrad ...

最新文章

  1. GitHub代码一键转VS Code:只需+1s
  2. hibernate之生成的和默认的属性值(使用generated刷新实体) .
  3. 3.15 排列对称串
  4. 计算机的服务如何还原,电脑怎么样还原到出厂设置
  5. 便利蜂发布双11战报:当天外卖订单最多的是这个城市
  6. android 底部弹窗失效,Android实现从底部弹出Dialog(和PopWindow实现的效果同样)
  7. 编程练习赛11B 物品价值(装压dp)
  8. hdu-5754 Life Winner Bo(博弈)
  9. 解决Spring Boot启动项目Tomcat不能访问80端口的问题
  10. win10通过VMware使用教程
  11. itunes store服务中断_Apple目前正在经历App Store iTunes Store和Mac App Store的中断
  12. 如何查看声卡、pcm设备以及tinyplay、tinymix、tinycap的使用
  13. 浅谈车载控制器产线EOL实现方式
  14. Google设置应用专用密码
  15. Excel妙用-公式结果我都要
  16. 2022-2028全球全盘加密软件行业调研及趋势分析报告
  17. 网页设计课设【登录注册系统及增删改查】
  18. 编写Shell脚本实现用户管理
  19. 【OpenCV-Python】 直方图均衡化
  20. android开机调用搜狗输入法

热门文章

  1. springboot- jsp访问404的问题解决
  2. 计算机网络8832,2021年4月份自学考试计算机网络原理04741答案.doc
  3. 不错的向上滚动广告代码
  4. 工信部:“5G+工业互联网”在建项目全国已超2000余个
  5. 华为鸿蒙平板MatePad Pro 2支持多屏协同突破
  6. Redmi Note 10配备NFC 3.0功能:首次支持封闭式门卡
  7. 库克:iPhone 12更新换代用户数达到顶峰
  8. 库克发文纪念苹果成立45周年:伟大使命还有待实现
  9. 最不靠谱CEO,一句话让公司损失上千亿元
  10. 苹果悬赏100万美元找漏洞 辞职的理由找到了!