主页
Featured image of post Misc - 数据编码……

Misc - 数据编码……

涅普计划——数据编码部分的笔记……

文章字数:9717
预计阅读时长: 分钟

以下为涅普计划的课程笔记,建议搭配课程视频理解。

0x00 课程视频

课程视频

0x01 常见进制与进制转换

常见进制

计算机领域中,常用进制有:

  • 二进制(Binary、bin)
  • 八进制(Octal、oct)
  • 十六进制(Hexadecimal、hex)

有关这几种进制的优缺点、用处分析,可见“六六”在知乎问题“二进制,十进制,十六进制各有什么优缺点?”中的回答。

而在计算机中,存储信息归根到底都是以二进制存储的
八进制和十六进制,只是为了简化二进制的表达,方便观察记录。

如将1010 0101 1100 1011这复杂的一串二进制,转化为十六进制就为A 5 C D,更方便记录和观察。

进制转换

因为信息都是以二进制的形式存储,所以二进制可以转换为各种信息。

进制转换类别
进制转换类别

1. 二进制转ASCII码

每八位为一个整体,将其转换为十进制后,对应ASCII码表查询得到对应的字符。

e.g.

一串二进制串01101110 01101001 01100011 01101111
将其按每八位一节转换为十进制后为110 105 99 111
查询ASCII码表,得到字符串nico

2. 二进制转Morse码

跟二进制转ASCII码一样,
将一串二进制转化为ASCII码中的.-(空格),来表示摩尔斯码。

Morse码中:

  • . 对应的ASCII码为46、二进制为0010 1110
  • - 对应的ASCII码为45、二进制为0010 1101
  • 对应的ASCII码为32、二进制位0010 0000

e.g.

一大串二进制数据:
00101101 00101110 00100000 00101110 00101110 00100000 00101101 00101110 00101101 00101110 00100000 00101101 00101101 00101101
发现其中仅由001011010010111000100000三种二进制节构成,对应于-.,故可知应为Morse码的二进制。

使用二进制转Morse转换工具,得到-. .. -.-. ---
在使用Morse转文本转换工具,得到nico这个文本。

3. 二进制转二维码

对于一二进制字符串,转成十进制、十六进制后分析不出有用信息,
若其长度$n$,满足$n=a^2(a∈Z)$,也就是这个长度是个完全平方数(如$625$),
可以考虑转换为二维码

其中0则代表白色,1则代表黑色。(也可能为反过来)

转换方式使用Python中的PIL(Pillow)库,按上述规则将二维码绘制出来。

Python代码:

from PIL import Image
MAX = * # 在这里输入二维码的长宽(为二进制字符串长度开根)
str = "..." # 在这里输入二进制字符串
pic = Image.new("RGB",(MAX, MAX))
i = 0
for y in range(0, MAX):
    for x in range(0, MAX):
        if (str[i] == '1'):
            pic.putpixel([x,y], (0, 0, 0)) # 为1,填充黑色
        else:
            pic.putpixel([x,y], (255, 255, 255)) # 为0,填充白色
        i += 1
pic.show() # 打开生成的二维码
pic.save("flag.png") # 保存二维码为flag.png

e.g.
例题中所生成的二维码:

进制转换 - 二进制转二维码例子
进制转换 - 二进制转二维码例子

4. 二进制转图片

先将二进制字符串转换为十六进制
再用十六进制编辑器,将转换后的十六进制数据,写入到新的文件中。

e.g.

对于例题所给的长串二进制,
先使用工具将其转换为十六进制,

进制转换 - 转图片 转十六进制
进制转换 - 转图片 转十六进制

然后打开十六进制编辑器,新建十六进制文件(不是文本文件),
将转换后的十六进制结果,粘贴到新文件中。

注意:010 Editor粘贴十六进制文本的快捷键位Ctrl+Shift+V,并非Ctrl+V。

进制转换 - 转图片 写入十六进制文件
进制转换 - 转图片 写入十六进制文件

可以发现文件头尾分别为FF D8FF D9,可知为JPG文件,
保存为JPG格式文件,可得到转换后的图片。

进制转换 - 转图片 转换得到图片
进制转换 - 转图片 转换得到图片

0x02 常见编码

ASCII

【应该都很熟悉这个ASCII码了……

把常用的字符(如a ~ zA ~ Z0 ~ 9、常用符号等),以一个特定的数来表示
则可以将常用的字符,转化为二进制数并且直接存储到计算机中。

标准的ASCII定义了128个字符,刚好为$2^7$个,所以部分ASCII码以每7位二进制为一个组合,来表示这128种字符。
但通常来说,为了统一,都是以每8位二进制为一个组合,最高位补0。

以下为ASCII码表可显示字符部分:

ASCII码表 - 可显示部分
ASCII码表 - 可显示部分

控制字符部分(0 ~ 31)可查看ASCII编码对照表

Base家族

base64

为最为常见的编码。

编码原理

3个8位的字节转化为4个6位的节,
之后在每个6位的节的前面补两个0,重新形成8位(一字节)形式。

6位的二进制最大容量为$2^6 = 64$,故其字符集只有64个字符,
分别为A ~ Za ~ z0 ~ 9+/

base64编码表
base64编码表

e.g.

base64转换例子
base64转换例子


虽然=不存在于编码表的,但其可能会出现在base64编码后的字符串中,
其作用是:
当字符不为$3$的倍数个时,会先用0将末尾补全,再用=表示填补了多少字节(8bits)的0

e.g.
A的ASCII是0100 0001,只有8位,
则会用0补成24位,变成0010 0001 0000 0000 0000 0000
然后划分成4个6位后高位补0,即为00010000 00010000 00000000 00000000, 对照表编码后即为QQ,补了$2$个字节的0,所以最终为QQ==

注意:不能将末尾补的00000000看作A

但为了避免=在URL和Cookie中产生歧义,部分base64编码也会把=去掉。

作用

可能有人会不懂发明这个base64编码有什么作用(比如我),
为什么不能直接传输原来的文本数据,而要通过这个base64编码后再传,
甚至编码后占用空间还变大了.jpg……

个人查阅学习了以后稍微有所理解,这里稍微写下来记录一下。 【以下为个人理解,很有可能有错误,仅供参考!……

个人理解的base64作用

首先对于各种文本的编码,如果只是简单的西欧文本(也就是ASCII码中包括的东西,如字母),处理就相对统一
但对于其他文本(如中文、俄文等),简单的ASCII码不能满足,于是会有各种其他的编码方式来处理这些文本(如GBK、JIS等)。

需注意这里的文本编码方式,都是怎么将我们这些各种字符,转化为数字(二进制)运用到计算机中。
ASCII码也是,就是将“a”字符传化为二进制0110 0001来处理。

这些编码方式,普遍与ASCII码的编码方式有区别
其中最突出的就是:

  • ASCII码的一字节8位中,最高位是0
  • 其他编码方式,很可能会使最高位位1

    比如对于汉字“你”,
    以UTF-8方式编码后,为111100100 10111101 10100000(hex: E4 BD A0)

    可以发现与标准的ASCII码对比,最高位是1

注意标准ASCII码与扩展ASCII码的区别:

标准的ASCII码最高位是0,也就是范围为0 ~ 127

而对于那些最高位是1的ASCII码,是之后扩充的,其属于不可见字符
对这些不可见字符,不同国家的处理方式也会不同。

所以只有最高位是0(范围为0 ~ 127)的ASCII码为真正的统一标准


这样的后果就是:
一些设备,对于传输过来的标准ASCII码中字符数据,处理方式都是一样的没问题。
但对于那些不可见字符的处理方式,就很可能不一样

比如传输了一个“a”过来,其以ASCII码传输为0110 0001
对于这个,所有设备都知道它是个“a”这个字符,所以能正确传输,

而对于“你”这个汉字,如果直接UTF-8编码后传输过来为111100100 10111101 10100000
不同设备的处理方式就会不同了。

比如有些可能强行将最高位变为0,传输成011100100 00111101 00100000,就完全不同了,
有些可能把这个当成个控制命令,而不是继续传输这个数据。


所以经过bse64编码后,将所有字符转化为标准ASCII码,
就能有效地避免在传输过程中的歧义操作了,
传输完成后再解码回来就可以了。

以下base编码方式大部分与base64相同,唯一区别只是字符集不同,故不再给出编码原理。

base36

字符集

0 ~ 9A ~ Z(或a ~ z)

包含$0 \sim 9$的数字,加上所有$26$个字母(不区分大小写,即大写或小写均可)。

不包含任何标点。

特点

  • 加密仅支持整数数字。
  • 解密仅支持字符串。
  • 不支持中文。

base58

字符集

123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ

仅包含部分数字和部分字母,
其中不包含:

  • 0(数字0)
  • l(小写L)
  • O(大写o)
  • I(大写i)

特点

为base64的字符集中,
去掉了四个容易引起视觉混淆的字符(0lOI),和两个符号(+/)。

$9$个数字$+49$个字母$=58$,所以称为base58。

base62

区别于base64的地方只是去掉了+/

base85

base85不太常用。

类似于base64的二进制文本编码形式,
通过使用$5$个ASCII字符来表示四个字节的二进制数据。


这个base85个人暂时不是很理解,
因为大于了$2^6=64$,所以跟base64的编码原理应该是不一样的,
字符集也不清楚。

【但网上也很少关于base85的资料orz……

目前只找到一份图,看样子应该是将4个字节划分为$6+7+6+7+6$这种划分形式转换为ASCII码的。

base85 - 例子
base85 - 例子

来源于Base系列编码浅析

因为说不常用就没深入去了解,
想要了解可以到google查阅英文文档看看吧。

base91、92

base91的字符集为:0-9a-zA-Z!#$%&()*+,./:;<=>?@[]^_`{|}~"(就是你键盘上除了\-'能打出来的所有符号)

base91 - 字符集
base91 - 字符集

base92比base91多一个(注意不是~


这两个编码方式相关资料很少,
只用了解并且会使用转换工具应该就可以了,不需要太深入掌握吧应该【……

转换工具

  • 网络上各种base编码转换工具。
  • CyberChef中Magic模块。
    特点:可自动识别为哪种base编码。
  • CyberChef中的 “From base …” 模块。

Morse电码

【简介略……

Morse电码表
Morse电码表

计算机中表示方法:

  • .来表示点
  • -来表示划
  • 常用空格来表示分割

shellcode

shellcode是一段用于利用软件漏洞而执行的代码。

shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。


在这里其实就是一串16进制数据
先转换为10进制,然后解码成ASCII即可。

e.g.
一串shellcode\x54\x68\x65
转换为10进制为84 104 101
对照ASCII码则为The

urlencode

url编码又称百分号编码,是统一资源定位(URL)编码方式。

URL地址(网址)中规定:
数字、字母和特定字符(/,:@等)可以直接使用,
其余必须通过%xx来编码
(其中的xx代表ASCII的十六进制。)

也就是说编码形式上跟shellcode差不多,不过把\x换成了%而已。

e.g.
The编码成urlencode就是%54%68%65

关于urlencode的拓展

经常可以见到,在地址栏中,一些汉字就会变成%xx这样的编码形式。
也就是这些汉字先以UTF-8编码变成16进制,然后又按urlencode加上%

e.g.
萌娘百科中童田明治的页面URL为:https://zh.moegirl.org.cn/%E7%AB%A5%E7%94%B0%E6%98%8E%E6%B2%BB
“童田明治”以UTF-8编码成十六进制数据后,分别为:

  • E7 AB A5(童)
  • E7 94 B0(田)
  • E6 98 8E(明)
  • E6 B2 BB(治)

对应到上方的URL中,就是%E7%AB%A5等。

Unicode

中文又称国际码、万国码等。

表示形式:

  • 十六进制表示
    • \u****
    • &#x****;
  • 十进制表示
    • &#****;

Unicode与UTF-8等的区别与联系

个人在学习的时候发现这两类东西很迷惑,网上各种说法也很混淆。
通过查找资料加上自我脑补x后,对这两类稍微明白了一点。

于是这里顺带提一下UTF-8、UTF-16等UTF-*编码,及其与Unicode编码的关系。

【内容太多故做折叠处理……

两类的区别联系

首先对于Unicode编码
其跟ASCII码一样,是一种对字符的编码方式
或者以术语来称呼,是一种“字符集”

其完成的是一种“字符—数字”的一一映射的转换。

比如ASCII码中,对于A这个字符,对应的数字(十进制)为65,也就是将字符A映射到数字65
Unicode编码中,对于A这个字符,对应的数字(十进制)为41,也就是将字符A映射到数字41

Unicode其实也有个跟ASCII码一样的表,不过太大了所以一张图放不下x……

其实Word中的“插入字符”,其就是按照Unicode的编号顺序来排列的,
可以看作一张跟ASCII码表一样的Unicode码表:

Word中的Unicode码表
Word中的Unicode码表

下方的字符代码,则是这个符号在Unicode这个映射表中对应的数字的十六进制形式。


Unicode本身是不断在扩充的,
最初它只选择了2个字节(16位),最多能表示$2^{16} = 65536$个字符。

但这里说选择2个字节实际上不恰当,因为Unicode并不是一种存储方式,而只是一种字符与数映射关系。存储方式由后面讲的UTF-8来决定

后面发现$65536$个也不够,所以又在前面加了8位,称为“扩展位”,
一共24位,最多能存$2^{24} = 16777216$个了。
【但这样扩展后又太多了,目前扩展位最多只用到了10(hex),也就是Unicode范围为000000 ~ 10FFFF
【【等到以后发现外星语后就可能再扩充,一直用到FFFFFF这样吧233333……

这里可以牢记两个对应思想:

  • $1$位十六进制对应$4$位二进制
  • $1$字节对应$8$位,也就是$2$位十六进制。


请注意:上面所说的Unicode只是一种字符集,一种对应方式,并没有涉及到怎么存储。
这里就可能会感到奇怪:明明通过Unicode,都对应成了数字,为什么不能直接像ASCII码一样把数字存下来就好了?

对啦!这种想法就是Unicode的存储方式之一——直接把序号存下来,跟ASCII码一样。
这种存储方式就叫做UTF-32

UTF-32编码方式:
将Unicode中的序号转换为16进制,再最高位补0至32位。

e.g.
对于“🀀”这个符号来说,【不要管为什么要举麻将啦2333【因为这个序号大一些这样……
其Unicode序号是126976,
也就是在Unicode这张表中,将字符🀀映射成了数字126976
转换为16进制为1F000

那么按我们想的,直接把这个序号数字存储下来,
但注意计算机中最好按$2^n(n∈N^+)$个字节来存储,【具体原因好像是因为内存对齐?……
这里已经是$5*4=20$位了,2个字节不够,
所以只能选择4个字节,也就是32位来存

那么跟很多编码操作一样,最高位补0, 于是变成了001F 0000

那么也就是按UTF-32编码后🀀则被编码成001F 0000


可以发现,
UTF-32好处就是非常直观
但缺点也很明显:太浪费空间了。

原本用ASCII编码,1个字节就能存储表示的英文字母,
到UTF-32编码,就要用4个字节了。

这在当时昂贵的存储代价和极扣x的程序员们的眼中是不能忍受的!
于是他们又机智地创造出别的编码方法,
也就是UTF-8和UTF-16。

这两种编码方法具体怎么实现这里就不讲了,有兴趣可以自己查阅。
但可以知道的是:
UTF-16用$2$或$4$字节,
UTF-8用$1\sim4$字节。

无论怎样,都比UTF-32纯用$4$字节好多了。


那么对于以上,可以总结出以下说法:

  • Unicode只是一种字符集,是一种字符对应数字的映射,并不能说是一种编码

  • 各种UTF-*才真正实现了Unicode在计算机上的存储,才能说是编码

  • Unicode可以对字符进行“初步编码”,然后用&#&#x\u来表示。

    ,Unicode序号为30495(hex:771F,可以表示为&#30495;&#x771F;\u771F

  • UTF-*是对Unicode编码后的数字进行的的一种“再编码”。


更多扩展

对于网络上各种Unicode编码工具,
如果只是简单的对中文编码是不存在问题的。

而对版本较新,序号较大(16进制用了5位及以上)的字符,则会出现问题。

仍以序号比较大的🀀为例:

首先通过网站查询,得到以下信息。

Unicode - 符号🀀信息
Unicode - 符号🀀信息

将重要信息已经用红线划出。
查询地址

则Unicode编码结果应该为&#126976;&#x1F000;\u1F000

  1. 站长工具
    站长工具 - Unicode编码结果
    站长工具 - Unicode编码结果

    发现与推断出的不符合。
  2. SOJSON在线解析
    SOJSON在线解析 - Unicode编码结果
    SOJSON在线解析 - Unicode编码结果

    点击HTML预览后,很明显看到左上角为两个乱码。

如果需要正确转换,可以使用千千秀字中的HTML字符实体转换工具

HTML字符实体转换工具
HTML字符实体转换工具


刚接触Unicode时,总会将其与ASCII比较,
但现在可以发现:
ASCII编码,实际上是字符集和编码方法的整合

字符集就是基本的ASCII码表,
不过其编码方法十分简单粗暴,字符集对应的序号是多少,编码后就是多少。

而Unicode中,字符集有了后,
本来也有跟ASCII一样简单粗暴的编码方法,就是UTF-32,
但当时的储存代价很高,于是人们将扣的艺术运用到极致,
创造了UTF-16、甚至UTF-8这些编码方式,减小了储存消耗。

这也产生了现在的歧义。

假想一下:
如果当时技术力就很高,储存代价极小,
有可能像ASCII那样,就用UTF-32存,
不用再去想UTF-8这种抠门方式,
那应该今天就不会有这种Unicode与UTF-8是什么关系的迷惑了_(:з」∠)_……

aaencode

使用颜文字进行的编码。

特点:
可以将JavaScript代码编码,并且可以直接执行
也就是常说的颜文字js加密。

e.g.
一段js代码,

alert("nico")

将这段js代码用aaencode编码后,

゚ω゚ノ= /`m´)ノ ~┻━┻   //*´∇`*/ ['_']; o=(゚ー゚)  =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+/*´∇`*/(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+(゚ー゚)+(゚Θ゚)+(゚Д゚)[゚ε゚]+(゚Θ゚)+((゚ー゚) + (゚Θ゚))+(゚ー゚)+(゚Д゚)[゚ε゚]+(゚Θ゚)+(゚ー゚)+((゚ー゚) + (゚Θ゚))+(゚Д゚)[゚ε゚]+(゚Θ゚)+((o^_^o) +(o^_^o))+((o^_^o) - (゚Θ゚))+(゚Д゚)[゚ε゚]+(゚Θ゚)+((o^_^o) +(o^_^o))+(゚ー゚)+(゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+(c^_^o)+(゚Д゚)[゚ε゚]+(゚ー゚)+((o^_^o) - (゚Θ゚))+(゚Д゚)[゚ε゚]+(゚Θ゚)+((゚ー゚) + (゚Θ゚))+((o^_^o) +(o^_^o))+(゚Д゚)[゚ε゚]+(゚Θ゚)+((゚ー゚) + (゚Θ゚))+(゚Θ゚)+(゚Д゚)[゚ε゚]+(゚Θ゚)+(゚ー゚)+(o^_^o)+(゚Д゚)[゚ε゚]+(゚Θ゚)+((゚ー゚) + (゚Θ゚))+((゚ー゚) + (o^_^o))+(゚Д゚)[゚ε゚]+(゚ー゚)+((o^_^o) - (゚Θ゚))+(゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+(゚Θ゚)+(゚Д゚)[゚o゚]) (゚Θ゚)) ('_');

使用开发者工具中控制台执行这段编码后的代码效果:

aaencode - 效果
aaencode - 效果

可以看到效果确实同alert("nico")

【这是什么稀奇古怪又可可爱爱的编码方式啊.jpg……

jjencode

用途等同"aaencode",
不同在于jjencode使用$=+_[]等符号进行编码。

e.g.
同上例,

alert("nico")

将这段js代码用jjencode编码后,

$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.$_$+$.$$_+"\\"+$.__$+$.$_$+$.__$+$.$$__+$._$+"\\\")"+"\"")())();

运行后一样的效果。

uuencode

是二进制信息和文字信息之间的转换编码。

常用于电子信息的传输。


具体编码过程没有去了解。
【能够了解并使用工具转换就可以了x……

jsfuck

跟"aaencode"和"jjencode"差不多。

区别是:用六个字符[]()!+来重新编码。

brainfuck

跟"jsfuck"、“aaencode"和"jjencode"差不多。
【你呀,总能给我玩点新花样【指js……

区别是:用八个字符[]<>+-.,来重新编码。

Ook

比赛中常见。

有两种形式。

1. “Ook!”

Ook.Ook!Ook?三个字符串组成。

2. “Short Ook!”

只有.!?三个字符组成。

经典例题:
在图片的lsb隐写中,藏有ShortOok!。

Ook - 经典例题
Ook - 经典例题

敲击码

是一种很简单的对文本信息进行编码的方式。

基于$5\times5$的方格(波利比奥斯方阵)来实现,
区别在于:K字母被整合到C中。

敲击码
敲击码

e.g.
F,对应位置为$(2,1)$,所以可以编码为21。

二维码

用某种特定的几何图形按一定规律,在平面分布的黑白相间的图形,来记录数据符号信息。

种类:

  • 堆叠式/行排式(堆积式或层排式)
  • 矩阵式

常见的二维码:

  • Code 16K
  • Code 49
  • PDF417
  • QR Code

二维码 - 常见形式
二维码 - 常见形式

矩阵式二维码

最流行的就是QR Code,
也就是我们常说的二维码。

其是在一个矩阵空间通过黑、白像素在矩阵中的不同分布进行编码。

用点(方点、圆点或其他形状)的出现表示二进制1
不出现表示二进制0
点的排列组合确定了矩阵式二维码所代表的意义。

矩阵式二维码是建立在计算机图像处理技术、组合编码原理等基础上的一种新型图形符号自动识读处理码制。

代表性的矩阵式二维码:

  • Code One
  • MaxiCode
  • QR Code
  • Data Matrix
  • Han Xin Code
  • Grid Matrix

QR Code

特点

  1. 储存大容量信息。
    传统的条形码只能处理$20$位左右的信息量,QR码可以处理条形码几十到几百倍的信息量。
  2. 支持所有类型的数据。(如:数字、英文字母、日文字母、汉字、二进制、控制码等)
  3. 在小空间内可打印。
    使用纵向和横向两个方向处理数据,所以相同信息量,QR码所占空间为条形码十分之一。(Micro QR码可以更小)
  4. 解码速度快。

基本结构

  • 格式信息:纠错等级
  • 版本信息:即二维码规格(QR码符号共有$40$种规格的矩阵)

二维码 - 基本结构
二维码 - 基本结构

考点

  1. 将定位点拿掉,需要自己去补充定位点。
  2. 修复二维码。
    基于纠错等级,只给部分信息,需要自己补全。
    可以使用工具:QRazyBox

    解题方法:使用工具先调整纠错等级,使得跟残缺二维码一致;然后再手动填充。

稀奇古怪的编码

以下编码由于特点明显,故不详细介绍。均可以直接搜索相关编码解码工具。

社会主义核心价值观编码

特点:由社会主义核心价值观十二个词构成。

与佛论禅

特点:开头为“佛曰:”。

与熊论道

特点:开头为“熊曰:”。


0x03 写在最后

以上大部分为个人总结,由于这里也刚入门,很多地方可能存在错误。如发现错误请及时指出,谢谢!……

如对以上内容存在疑惑不解的地方,也可以询问我。如果我了解的话会尽力解答;不了解的话可以一起努力弄明白hhh……

感谢1cePeak师傅的辛勤付出!……

以上……