二维码の数据编码Data Encoding

数据编码,即将二维码存储的字符转化成二进制。 这些字符可以是数字、字母、中文。 那么数据码编码时,就根据数字模式,混合字母模式,8位字节模式,汉字模式进行编码。 8位字节模式可以描述整个计算机世界的字符,而其他模式是量身打造的,所以所需字节比8位字节模式要少。

大致流程图

二维码の数据编码Data Encoding_第1张图片
图源链接

细化步骤

1. 选择纠错级别
在对数据进行编码之前,选择一个纠错级别。正如介绍中提到的,二维码使用Reed-Solomon纠错创建纠错码字(字节)。二维码阅读器可以使用这些纠错字节来确定它是否没有正确读取数据,并且可以使用纠错码字来纠正这些错误。纠错有四个级别:L、M、Q、H。下表列出了这些级别及其纠错能力。
二维码の数据编码Data Encoding_第2张图片
2. 确定数据的最小版本
不同大小的二维码称为版本。有四十个版本可用。最小的版本是版本 1,大小为 21 像素 x 21 像素。版本 2 是 25 x 25 像素。最大的版本是版本 40,大小为 177 x 177 像素。每个版本都比以前的版本大 4 个像素。
每个版本都有最大容量,具体取决于使用的模式。此外,纠错级别进一步限制了容量。该字符容量表列出了所有QR版本对于给定的编码方式和纠错等级的能力。

  • 如何确定最小版本
    此时,计算要编码的字符数,并根据编码模式和所需的纠错级别确定可以包含该字符数的最小版本。
    例如,短语HELLO WORLD有 11 个字符。如果使用 Q 级纠错编码, 字符容量表表表示使用 Q 级纠错的版本 1 代码在字母数字模式下可以包含 16 个字符,因此版本 1 是可以包含此数量字符的最小版本。如果短语长于 16 个字符,例如 HELLO THERE WORLD(17 个字符)版本 2 将是最小的版本。

  • 上限
    最高容量二维码为40-L(版本40,纠错等级L)。下表列出了四种编码模式下 40 升 QR 码的容量。这是单个二维码可以包含的最大可能字符数。40-M、40-Q 和 40-H 版本容量较低,因为它们需要更多空间来容纳更多纠错码字。所有版本的容量表,请参见字符容量表。
    二维码の数据编码Data Encoding_第3张图片

3. 添加模式指示器
每个编码模式都有一个四位模式指示符来标识它。编码数据必须以适当的模式指示符开始,该指示符指定用于其后位的模式。下表列出了每种模式的模式指示灯。
例如,如果以混合字母模式编码HELLO WORLD,则模式指示符为 0010。
二维码の数据编码Data Encoding_第4张图片

4. 添加字符计数指示器
字符计数指示符是一个字符串,表示正在编码的字符数。字符计数指示器必须放在模式指示器之后。此外,字符计数指示符的长度必须是特定的位数,具体取决于 QR 版本。
计算原始输入文本中的字符数,然后将该数字转换为二进制。字符计数指示器的长度取决于编码模式和将使用的二维码版本。要使二进制字符串具有适当的长度,请在左侧填充 0。
以下列表包含每个模式和版本的字符计数指示器的大小。例如,如果 以字母数字模式在版本 1 QR 代码中编码HELLO WORLD,则字符计数指示符必须为 9 位长。HELLO WORLD的字符数是 11。在二进制中,11 是 1011。将其填充在左侧使其长度为 9 位:000001011。将其放在步骤 3 中的模式指示符之后得到以下位串:0010 000001011
二维码の数据编码Data Encoding_第5张图片

5. 使用所选模式进行编码
第一节的数据分析中,解释了如何为给定的字符串选择合适的编码模式。每种编码模式的过程在对应页面上进行了解释。下面带你了解每种模式的编码过程。

- 数字模式编码
首先,将字符串分成三个数字组。如果字符串的长度不是 3 的倍数,则最后一组数字必须只有一到两个数字长。分成三组后:867 530 9
然后,将每组数字视为一个三位数(如果最后一组是两位或一位长则少于三位数)。将该三位数字转换为 10 个二进制位。如果一组以零开头,则应将其解释为两位数并应将其转换为 7 个二进制位,如果这组开头有两个零,则应将其解释为一位数数字,您应该将其转换为 4 个二进制位。同样,如果最后一组只有两位数字,则应将其转换为 7 个二进制位,如果最后一组仅由一位数字组成,则应将其转换为 4 个二进制位。
转换为二进制:
867 → 1101100011
530 → 1000010010
9 → 1001

- 混合字母编码
对于混合字母模式编码,我将使用HELLO WORLD的示例输入。对于此示例,我将使用版本 1。注意,混合字母模式只能对大写字母进行编码,不能对小写字母进行编码。有关可以以混合字母模式编码的字符列表,请参阅字母数字表。
首先,将字符串分解成字符对:HE, LL, O , WO, RL, D
然后,每个字符由一个数字表示。请参考字母数字表来查找这些数字。左边的列显示字母数字字符,右边的列显示代表它的数字。
对于每对字符,获取第一个字符的数字表示(来自字母数字表)并将其乘以 45。然后将该数字与第二个字符的数字表示相加。
例如,HELLO WORLD 中的第一对是 HE。
H → 17
E → 14
按照上述步骤,将第一个数字乘以 45,然后将其与第二个数字相加
(45 * 17) + 14 = 779
现在将该数字转换为 11 位二进制字符串,如有必要,在左侧填充 0。
779 → 01100001011
如果您正在编码奇数个字符,就像我们在这里一样,取最后一个字符的数字表示并将其转换为 6 位二进制字符串。

- 字节模式编码
数据字符串由模式指示符、字符计数指示符和输入文本中的原始字节组成。
在这里插入图片描述
字节模式的默认字符集是 ISO 8859-1,因此要将输入文本转换为此字符集。二维码规范讨论了 ECI 模式,它允许您指定与 ISO 8859-1 不同的字符集,但一些二维码阅读器不理解 ECI 转义序列。
如果输入字符串中存在无法在 ISO 8859-1 中编码的字符,您可以改为使用 UTF-8 对其进行编码,因为某些二维码阅读器能够检测并正确显示 UTF-8 编码字节模式,不需要任何 ECI 转义序列。
为了解决这个问题,可以测试不同的 QR 码阅读器,了解它们如何以字节模式处理非 ISO 8859-1 字符,或者要求您的用户提供有关他们使用的 QR 码阅读器信息。
将您的输入字符串转换为 ISO 8859-1 或 UTF-8(如果您的用户具有可以以字节模式识别它的二维码阅读器)后,您必须将字符串拆分为 8 位字节。
例如,使用输入字符串“Hello, world!” 创建版本 1 QR 代码。由于它包含小写字母、逗号和感叹号,因此不能使用不包括小写字母、逗号或感叹号的字母数字模式进行编码。
将字节转换为 8 位二进制字符串。如有必要,在左侧填充 0 以使每个 8 位长。
例如字符串与每个字节转换为8位二进制字符串:
ħ→0x48→01001000
Ë→0x65→01100101
,→0x2c上→00101100
波→0x77 → 01110111

- 汉字模式
仅适用于双字节Shift JIS字符
先将字符转换为字节。例如,茗荷字符可以转换如下。
茗→0xE4AA
荷→0x89D7
汉字模式有两种编码双字节汉字字符的方法。一种方法是针对字节在 0x8140 到 0x9FFC 范围内的字符。另一种方法适用于字节在 0xE040 到 0xEBBF 范围内的字符。
例如:
荷在 Shift JIS 中是 0x89D7,所以它在 0x8140 到 0x9FFC 的范围内。第一步是从十六进制值中减去 0x8140。
0x89D7 - 0x8140 = 0x0897
结果是 0x0897。将该数字拆分为其最高有效字节和最低有效字节:
0x0897 的最高有效字节为 0x08 0x0897 的
最低有效字节为 0x97
接下来,将最高有效字节乘以 0xC0,然后将最低有效字节添加到结果中:
(0x08 * 0xC0) + 0x97 = (0x600) + 0x97 = 0x697
最后,将该结果转换为 13 位二进制:
0x697 = 0 0110 1001 0111
茗在 Shift JIS 中是 0xE4AA,所以它在 0xE040 到 0xEBBF 的范围内。第一步是从十六进制值中减去 0xC140。在这个例子中:
0xE4AA - 0xC140 = 0x236A
结果是 0x236A。将该数字拆分为其最高有效字节和最低有效字节:
0x236A 的最高有效字节为 0x23 0x236A 的
最低有效字节为 0x6A
接下来,将最高有效字节乘以 0xC0,然后将最低有效字节添加到结果中:
(0x23 * 0xC0) + 0x6A = (0x1A40) + 0x6A = 0x1AAA
最后,将该结果转换为 13 位二进制:
0x1AAA = 1 1010 1010 1010
最后,将两个二进制串放在一起完成编码。
二维码的茗荷编码为11010101010100011010010111

HELLO WORLD在混合字母模式页面上进行编码。继续 HELLO WORLD 示例,到目前为止的位串是:

模式指示符 字符计数指示符 编码数据
0010 000001011 01100001011 01111000110 10001011100 10110111000 10011010100 001101

6. 分解为8位编码字并在必要时添加填充字节
因为二维码规范要求位串必须完全填满二维码的总容量,可能需要添加 0 和填充字节。以下部分解释了向位串添加 0 和填充字节的过程。

确定特定 QR 码需要多少数据位,请参阅纠错表。找到正在编码的 QR 码使用的版本和纠错级别,并在标有“此版本和 EC 级别的数据代码字总数”的列中找到数字。将此数字乘以 8 以获得此版本和纠错级别所需的数据位总数。
例如,根据该表,版本1-Q码总共有13个数据码字。因此,此二维码所需的总位数为 13 * 8,即 104 位。
如果位串比所需位的总数短,则必须在串的右侧添加最多四个 0 的终止符。如果位串比所需的位数短四位以上,则在末尾添加四个 0。如果位串短于四位,则仅添加达到所需位数所需的 0 数。
例如,如果在版本 1-Q 二维码中编码HELLO WORLD,则上一节中提到的所需比特总数为 104 比特。本页第 3 步中显示的数据位串长度为 74 位。终止符最多只能有 4 位长,因此在字符串的右侧添加四个 0。生成的字符串仍然太短,无法填充 104 位容量,但 QR 码规范要求终止符的长度最多为四个 0。如果字符串是 102 位,则终止符的长度仅为 2 位。
以下是添加了终止符的HELLO WORLD字符串示例:

模式指示符 字符计数指示符 编码数据 终止符
0010 000001011 01100001011 01111000110 10001011100 10110111000 10011010100 001101 0000
添加终止符后,如果字符串中的位数不是8的倍数,则先在右边的字符串中填充0,使字符串的长度成为8的倍数。
例如,在 HELLO WORLD 字符串中添加终止符后,长度变为 78 位长。这不是 8 的倍数。此处显示的位串被分解为 8 位二进制字节:
00100000 01011011 00001011 01111000 11010001 01110010 11011100 010010001010101001010
最后有六位。添加两个 0 使其成为 8 位二进制字节:
00100000 01011011 00001011 01111000 11010001 01110010 11011100 01001101 01000011 010000 00
如果字符串仍然不够长,无法填满最大容量,则在字符串末尾添加以下字节,重复直到字符串达到最大长度
11101100 00010001
这些字节分别相当于 236 和 17。如果在此阶段位串太短,则二维码规范特别要求添加它们。
例如,上面的 HELLO WORLD 字符串是 80 位长。正如本页前面所述,1-Q 代码所需的容量是 104 位。必须添加以填充剩余容量的位数为 104 - 80,或 24。将其除以 8:24 /8 = 3。因此,必须在数据串的末尾添加三个填充字节。如下所示:
00100000 01011011 00001011 01111000 11010001 01110010 11011100 01001101 01000011 01000000 010101010101010

以上是实验室的翻译任务,原文链接如下:
https://www.thonky.com/qr-code-tutorial/

你可能感兴趣的:(编码学,大数据,bytecode)