QP编码详解
—
原理
QP编码是一种使用可打印的ASCII字符 (如字母、数字与"=")表示各种编码格式下的字符。其方法是将一个8bit的字符表示成两个16进制数,并在前面加一个“=”,共三个ASCII字符。
经过QP编码后的数据,通常是下面这个样子:
=E5=8D=8F=E8=AE=AE=E5=88=86=E6=9E=90=E4=B8=8E=E8=BF=98=E5=8E=9F
对QP编码而言,所有ASCII字符都可以直接用ASCII字符编码来直接表示,但是有一个例外,就是字符“=”,它将在QP编码中根据其十进制值被编码为“=3D”,因为它在编码过程中被使用。
另外,对制表符和空格符,即tab和space,虽然规定如果不出现在行尾可以用其ASCII字符编码直接表示,在行尾才需要被编码,但是实际应用中基本上都是统一处理,分别表示为“=09”(tab)和“=20”(space)。
而数据中的换行,即行结束标志,则需要转换为回车加换行,最终为0x0d0x0a,而最终的编码则是“=0D=0A”。
QP编码规定编码后的数据每行不能超过76个字符。当超过这个限制时,将在编码结果中使用软换行进行分行,即每75个字符后增加一个“=”,然后再接上换行CRLF,之后开始新的一行,这个“=”在解码的时候并不会解出任何数据。
—
例子
回头再看上文中的QP编码数据:
=E5=8D=8F=E8=AE=AE=E5=88=86=E6=9E=90=E4=B8=8E=E8=BF=98=E5=8E=9F
解码后即为"协议分析与还原"UTF8编码,每三个字节表示一个汉字:
可以看出,对QP编码进行解码相当简单,即将可见字符中除行结束外的每个“=”之后的两个ASCII字符直接当成一个16进制数值进行处理即可。
至于解QP编码的工具,网上很多,这里给一个:
http://web.chacuo.net/charsetquotedprintable
有什么问题,可联系我交流。
长按进行关注。
QP编码详解的更多相关文章
- H264 编码详解
H264 编码详解(收集转载) (1) x264_param_default( x264_param_t *param ) 作用: 对编码器进行参数设定 cqm:量化表相关信息 csp: ...
- 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- Protocol Buffers编码详解,例子,图解
Protocol Buffers编码详解,例子,图解 本文不是让你掌握protobuf的使用,而是以超级细致的例子的方式分析protobuf的编码设计.通过此文你可以了解protobuf的数据压缩能力 ...
- 字符编码详解 good
字符编码详解 字符编码详解
- Python2.7字符编码详解
目录 Python2.7字符编码详解 声明 一. 字符编码基础 1.1 抽象字符清单(ACR) 1.2 已编码字符集(CCS) 1.3 字符编码格式(CEF) 1.3.1 ASCII(初创) 1.3. ...
- Python字符编码详解,str,bytes
什么是明文 “明文”是可以是文本,音乐,可以编码成mp3文件.明文可以是图像的,可以编码为gif.png或jpg文件.明文是电影的,可以编码成wmv文件.不一而足. 什么是编码?把明文变成计算机语言 ...
- 转1:Python字符编码详解
Python27字符编码详解 声明 一 字符编码基础 1 抽象字符清单ACR 2 已编码字符集CCS 3 字符编码格式CEF 31 ASCII初创 311 ASCII 312 EASCII 32 MB ...
- 转2:Python字符编码详解
1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Information Interchange),是一种单字节的编码.计算机世界里一开始只有 ...
- 字符编码详解及由来(UNICODE,UTF-8,GBK)[转帖]
相信許多人對字符編碼都不是很了解,透過下文可以清晰的理解各种字符编码方式详解及由来. 一直对字符的各种编码方式懵懵懂懂,什么ANSI.UNICODE.UTF-8.GB2312.GBK.DBCS.UCS ...
随机推荐
- AQS(AbstractQueuedSynchronizer)解析
AbstractQueuedSynchronizer是JUC包下的一个重要的类,JUC下的关于锁相关的类(如:ReentrantLock)等大部分是以此为基础实现的.那么我们就来分析一下AQS的原理. ...
- C# 波浪线绘制
波浪线效果如上 界面绘制操作 private Point? _startPoint = null; private void ContainerCanvas_OnPreviewMouseLeftBut ...
- python爬虫公众号所有信息,并批量下载公众号视频
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 数据分析实战 PS:如有需要Python学习资料的小伙伴可以加点击 ...
- JavaScript-三种弹窗方式
0918自我总结 JavaScript-三种弹窗方式 一.alert 带内容的弹框 用法: <script> alert('弹窗显示的内容') //会弹出框没有点确定不会执行下面的代码会发 ...
- Inherit from the Business Class Library Class 继承自Business类(EF)
In this lesson, you will learn how to implement business classes for your application using the Busi ...
- socket调试工具(Mac版)
基于Mac版的Socket测试功能,类似于PostMan的功能,对于Socket长链接的项目开发很有帮助. 本人也是通过好多渠道才找到这篇文章,与大家共享: 按照步骤一步一步来就对了~ 本文参考于:h ...
- Thymeleaf对象的使用:数字对象
Thymeleaf主要使用 org.thymeleaf.expression.Numbers 类处理数字,在模板中使用 #numbers 对象来处理数字. 开发环境:IntelliJ IDEA 201 ...
- form-data、x-www-form-urlencoded、raw、binary的区别(非原创)
文章大纲 一.form-data介绍二.x-www-form-urlencoded介绍三.raw介绍四.binary介绍五.参考文章 一.form-data介绍 http请求中的multipart/f ...
- Rman Enhancements(增强) In Oracle 11g. (Doc ID 1115423.1)
Rman Enhancements In Oracle 11g. (Doc ID 1115423.1) APPLIES TO: Oracle Database - Enterprise Edition ...
- vscode笔记
一.修改操作栏字体 https://www.cnblogs.com/liuyangfirst/p/9759966.html 1.代码改写,进入默认安装的如下路径,搜索workbench 2.用Vs c ...