我尝试使用移动条形码阅读器和在线工具读取条形码(请参见下图),并获取:数据- 30925018 ,可视化算法- Code128C >
然后我尝试根据给定的数据生成条形码并得到以下图像:
原始条形码
生成的条形码
如您所见,图像是不同的。因此,我决定自己解密。结果如下:
原始解密的条形码
生成的解密条形码
如Wikipedia所说(https://en.wikipedia.org/wiki/Code_128):
校验位是加权的103模校验和。它是通过将每个符号“值”的乘积的起始码“值”乘以其在条形码字符串中的位置的乘积求出的。
我试图通过我的应用程序中的Java库以及在线工具根据给定的数据生成条形码。两者都给了我相同的结果。
答案 0 :(得分:3)
原始图像是表示以下GS1应用程序标识符格式数据的GS1-128(以前称为EAN-128)
(30)925018
含义是项数:925018 。
- 我认为GS1-128规范可能是条形码开头的FNC1的原因
正确。根据定义,以FNC1字符开头的代码128是GS1-128,因此应包含根据GS1规范编码的数据。
以下答案提供的背景描述了此编码的原理:https://stackoverflow.com/a/31760872/2568535
- 最后的FNC1只能是校验和。
在Code 128规范(和任何派生应用标准)中,校验和是必需的,并且通常不会以任何人类可读的文本形式显示。在您生成的符号中(不是GS1-128,因为没有“ FNC1开头”),如果校验和字符恰好与FNC1匹配,那只是一个巧合,尽管-正如Brian Anderson指出的那样-不会。>
答案 1 :(得分:2)
原始条形码的开头是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或代码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个“点”),除非它是终止字符(在这种情况下为13个“点”)。每个点的宽度与图形成比例。最好不要忽略每个字符的尾随“零”。它们很重要。