为什么大写字母的二维码比小写字母的二维码小?
看看这两个 QR 码。 如果你喜欢,可以扫描一下,我保证里面没有任何可疑之处。
左侧为大写 HTTPS://EDENT.TEL/
,右侧为小写 https://edent.tel/
可以清楚地看到,左边的 QR 是一个 “较小 ”的 QR,因为它的数据位较少。这两个 QR 都指向相同的 URl,唯一的区别是大小写不同。
这是怎么回事?
你首先想到的可能是纠错级别不同。二维码的冗余度会越来越高,以确保在损坏时仍能被扫描。但是,在这种情况下,它们都具有低纠错功能。
较小的代码是 “类型 1”–它是 21px * 21px。较大的是 “类型 2”,为 25px * 25px。
官方规范对这些版本有更详细的描述。较小的代码应能容纳 25 个字母数字字符。但 https://edent.tel/
只有 18 个字符。那么,为什么要把它放到较大的代码中呢?
使用 ZXING 等解码器可以查看每个代码的原始字节。
大写:
20 93 1a a6 54 63 dd 28
35 1b 50 e9 3b dc 00 ec
11 ec 11
小写:
41 26 87 47 47 07 33 a2
f2 f6 56 46 56 e7 42 e7
46 56 c2 f0 ec 11 ec 11
ec 11 ec 11 ec 11 ec 11
ec 11
您可能已经注意到,它们都以相同的序列结尾: ec 11
这些是 “填充字节”,因为数据需要完全填满 QR 码。但是–等等!- 上边的字节不仅安全地包含了文本,而且还有一些空闲的填充字节?
答案就在前几个字节中。
一旦读取了原始字节,QR 扫描仪就需要确切地知道它正在处理的是哪种代码。前四位会告诉它模式。让我们把十六进制转换成二进制,然后在前四位后进行拆分:
Type | HEX | BIN | Split |
---|---|---|---|
UPPER | 20 93 |
00100000 10010011 |
0010 000010010011 |
lower | 41 26 |
01000001 00100110 |
0100 000100100110 |
上部代码为 0010
,表示字母数字模式–标准规定接下来的 9 位显示数据长度。
下位代码为 0100
,表示字节模式–标准规定接下来的 8 位显示数据长度。
Type | HEX | BIN | Split |
---|---|---|---|
UPPER | 20 93 |
00100000 10010011 |
0010 0000 10010 |
lower | 41 26 |
01000001 00100110 |
0100 000 10010 |
看看这个!它们的长度都是 10010
,转换成二进制后是 18,正好是文本的长度。
字母数字模式每两个字符使用 11 位,而字节模式每个字符使用(你猜对了!)8 位。
但为什么小写字母代码要被推入字节模式呢?不是使用字母和数字吗?
嗯,是的。但为了高效存储数据,字母数字模式只能使用有限的字符子集。大写字母和少量标点符号:空格 $ % * + - . /
:
幸运的是,这对于协议、域和路径来说已经足够了。遗憾的是,没有 GET 参数。
就是这样。如果您希望包含 URl 的二维码的物理尺寸尽可能小,请确保文本全部使用大写字母。
本文文字及图片出自 Why are QR Codes with capital letters smaller than QR codes with lower-case letters?
你也许感兴趣的:
- 只给不常见的代码添加注释
- 简洁代码与软件设计哲学
- Torvalds:作为 C 语言维护者,你可以避免使用 Rust,但不能干涉它。
- 为什么 target=”_blank” 前面有下划线?
- 揭秘 Python 的 10 个隐藏技巧
- Meta 声称在没有做种证据的情况下下载盗版图书不违法
- Julia 的新天地
- 丑陋的代码和蠢事
- 如果您使用 Python… 你现在就需要了解这 3 个工具!
- 【外评】谷歌:从源头消除内存安全漏洞
你对本文的反应是: