以下为涅普计划的课程笔记,建议搭配课程视频理解。
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
发现其中仅由00101101
、00101110
、00100000
三种二进制节构成,对应于-
、.
、␠
,故可知应为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
4. 二进制转图片
先将二进制字符串转换为十六进制,
再用十六进制编辑器,将转换后的十六进制数据,写入到新的文件中。
e.g.
对于例题所给的长串二进制,
先使用工具将其转换为十六进制,
![]()
进制转换 - 转图片 转十六进制 然后打开十六进制编辑器,新建十六进制文件(不是文本文件),
将转换后的十六进制结果,粘贴到新文件中。
注意:010 Editor粘贴十六进制文本的快捷键位Ctrl+Shift+V,并非Ctrl+V。
![]()
进制转换 - 转图片 写入十六进制文件 可以发现文件头尾分别为
FF D8
和FF D9
,可知为JPG文件,
保存为JPG格式文件,可得到转换后的图片。
![]()
进制转换 - 转图片 转换得到图片
0x02 常见编码
ASCII
【应该都很熟悉这个ASCII码了……
把常用的字符(如a ~ z
、A ~ Z
、0 ~ 9
、常用符号等),以一个特定的数来表示。
则可以将常用的字符,转化为二进制数并且直接存储到计算机中。
标准的ASCII定义了128个字符,刚好为$2^7$个,所以部分ASCII码以每7位二进制为一个组合,来表示这128种字符。
但通常来说,为了统一,都是以每8位二进制为一个组合,最高位补0。
以下为ASCII码表可显示字符部分:
控制字符部分(0 ~ 31)可查看ASCII编码对照表。
Base家族
base64
为最为常见的编码。
编码原理
把3个8位的字节转化为4个6位的节,
之后在每个6位的节的前面补两个0
,重新形成8位(一字节)形式。
6位的二进制最大容量为$2^6 = 64$,故其字符集只有64个字符,
分别为A ~ Z
、a ~ z
、0 ~ 9
、+
、/
。
虽然=
是不存在于编码表的,但其可能会出现在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
, 对照表编码后即为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 ~ 9
、A ~ Z
(或a ~ z
)
包含$0 \sim 9$的数字,加上所有$26$个字母(不区分大小写,即大写或小写均可)。
不包含任何标点。
特点
- 加密仅支持整数数字。
- 解密仅支持字符串。
- 不支持中文。
base58
字符集
123456789
、abcdefghijk
、mnopqrstuvwxyz
、ABCDEFGH
、JKLMN
、PQRSTUVWXYZ
。
仅包含部分数字和部分字母,
其中不包含:
0
(数字0)l
(小写L)O
(大写o)I
(大写i)
特点
为base64的字符集中,
去掉了四个容易引起视觉混淆的字符(0
、l
、O
、I
),和两个符号(+
、/
)。
$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码的。
来源于Base系列编码浅析。
因为说不常用就没深入去了解,
想要了解可以到google查阅英文文档看看吧。
base91、92
base91的字符集为:0-9
、a-z
、A-Z
、!#$%&()*+,./:;<=>?@[]^_`{|}~"
(就是你键盘上除了\
、-
、'
能打出来的所有符号)
base92比base91多一个〜
(注意不是~
)
这两个编码方式相关资料很少,
只用了解并且会使用转换工具应该就可以了,不需要太深入掌握吧应该【……
转换工具
- 网络上各种base编码转换工具。
- CyberChef中Magic模块。
特点:可自动识别为哪种base编码。 - CyberChef中的 “From base …” 模块。
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码表
下方的字符代码,则是这个符号在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
,可以表示为真
、真
、\u771F
。 -
UTF-*是对Unicode编码后的数字进行的的一种“再编码”。
更多扩展
对于网络上各种Unicode编码工具,
如果只是简单的对中文编码是不存在问题的。
而对版本较新,序号较大(16进制用了5位及以上)的字符,则会出现问题。
仍以序号比较大的
🀀
为例:首先通过网站查询,得到以下信息。
![]()
Unicode - 符号🀀信息
将重要信息已经用红线划出。
查询地址则Unicode编码结果应该为
🀀
、🀀
、\u1F000
- 站长工具
![]()
站长工具 - Unicode编码结果
发现与推断出的不符合。- SOJSON在线解析
![]()
SOJSON在线解析 - Unicode编码结果
点击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 - 效果
可以看到效果确实同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!”
只有.
、!
、?
三个字符组成。
敲击码
是一种很简单的对文本信息进行编码的方式。
基于$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
特点
- 储存大容量信息。
传统的条形码只能处理$20$位左右的信息量,QR码可以处理条形码几十到几百倍的信息量。 - 支持所有类型的数据。(如:数字、英文字母、日文字母、汉字、二进制、控制码等)
- 在小空间内可打印。
使用纵向和横向两个方向处理数据,所以相同信息量,QR码所占空间为条形码十分之一。(Micro QR码可以更小) - 解码速度快。
基本结构
- 格式信息:纠错等级
- 版本信息:即二维码规格(QR码符号共有$40$种规格的矩阵)
考点
- 将定位点拿掉,需要自己去补充定位点。
- 修复二维码。
基于纠错等级,只给部分信息,需要自己补全。
可以使用工具:QRazyBox。
解题方法:使用工具先调整纠错等级,使得跟残缺二维码一致;然后再手动填充。
稀奇古怪的编码
以下编码由于特点明显,故不详细介绍。均可以直接搜索相关编码解码工具。
社会主义核心价值观编码
特点:由社会主义核心价值观十二个词构成。
与佛论禅
特点:开头为“佛曰:”。
与熊论道
特点:开头为“熊曰:”。
0x03 写在最后
以上大部分为个人总结,由于这里也刚入门,很多地方可能存在错误。如发现错误请及时指出,谢谢!……
由于目前博客不支持附件上传下载,所以如果需要上述中的文件,可以联系我分享文件【联系方式在关于页面中有……
如对以上内容存在疑惑不解的地方,也可以询问我。如果我了解的话会尽力解答;不了解的话可以一起努力弄明白hhh……
感谢1cePeak师傅的辛勤付出!……
以上……