Code128 条码规范是否需要校验和?

Is a checksum required in the Code128 barcode specification?

简介

第 1 步

我尝试使用手机条码reader和在线工具读取条码(见下图)并得到它:数据 - 30925018,可视化算法 - 代码128C

第 2 步

然后我尝试从给定的数据生成条形码并得到这些图像:

原始条码

生成条形码

第 3 步

如您所见,图像有所不同。所以,我决定自己解密。这是结果:

原始解密条码

生成解密条码

澄清

  1. 正如维基百科所说 (https://en.wikipedia.org/wiki/Code_128):

    The check digit is a weighted modulo-103 checksum. It is calculated by summing the start code 'value' to the products of each symbol's 'value' multiplied by its position in the barcode string.

  2. 我尝试通过应用程序中的 Java 库和在线工具从给定数据生成条形码。两者都给了我相同的结果。

问题

  1. 为什么在线工具生成的条码没有校验和,但最后有 FNC1?
  2. 为什么条码开头有一个FNC1?
  3. Code128 规范是否需要校验和?

我的想法

原始图像是 GS1-128(以前称为 EAN-128),表示以下 GS1 应用程序标识符格式的数据:

(30)925018

意思是项目数:925018

  • I think GS1-128 specification can be cause of FNC1 at the beginning of the barcode

正确。根据定义,第一个位置以 FNC1 字符开头的 Code 128 是 GS1-128,因此应包含根据 GS1 规范编码的数据。

以下答案中提供的背景描述了这种编码背后的原理:

  • FNC1 at the end can be just a checksum.

校验和在 Code 128 规范(以及任何衍生应用标准)中是强制性的,通常不会显示在任何人类可读的文本中。在您生成的符号中(不是 GS1-128,因为没有 "FNC1 in first"),如果校验和字符恰好与 FNC1 匹配,那只是巧合,尽管 - 正如 Brian Anderson 所指出的那样 - 它没有。

原始条码以FNC1开头。这两个条形码的末尾都没有 FNC1。正如 Terry Burton 所述,开头的 FNC1 表示条码用于 GS1,该代码的数据通常表示为 (30)925018。为第一个条码计算的校验和是右括号的数字 09 或代码 128 字符 ')'。

105
102
30*2 = 60
92*3 = 276
50*4 = 200
18*5 = 90
(105 + 102 + 60 + 276 + 200 + 90) = 833
833 % 103 = 09 (')')

不带 FNC1 的条形码的第二个校验和是数字 26 或 Code 128 字符“:”(冒号)。

105
30
92*2 = 184
50*3 = 150
18*4 = 72
105 + 30 + 184 + 150 + 72 = 541
541 % 103 = 26 (':')

可能校验和等于 FNC1 字符?是的。校验和是对条形码中的元素和数字 103 的加权和进行取模运算的结果,因此任何不超过 102 (FNC1) 的数字都可以是校验和的结果。因为Code 128标准没有对校验和位置的字符(STOP之前的最后一个字符)赋予任何特殊意义,所以无关紧要。

当您尝试破译 Code 128 条形码时,请记住,字符间距是不存在的。字符将具有完全相同的宽度 (11 "dots"),除非它是停止字符(在这种情况下为 13 "dots")。每个点的宽度与图形成比例。您最好不要忽略每个字符的尾随 "zeroes"。它们很重要。