GS1条形码解析-似乎没有分隔字符

3
我有一个解析GS1条码(使用Zebra扫描仪)的程序,一直以为它工作得很好,直到我遇到了一个包装盒上有两个GS1条码的情况,一个是“线性”的,另一个是数据矩阵(UDI)。对于线性条码,它可以正常工作,成功地获取了GTIN和Serial号码。但数据矩阵不同,由于某种原因,它的内容要比线性代码长一些,末尾包含了一些生产日期等信息。
这是线性条码:(01)00380652555852(17)260221(21)25146965079(30)1 这是数据矩阵:(01)00380652555852(17)260221(21)2514696507911210222240SA60AT225
我在分析中遇到了获取串行号(Serial number)25146965079的问题。GS1中的串行号长度为1-20个字符,而该代码只有11个字符,但我应该如何让它在9个字符后停止?我怎么知道串行号就在那里结束了呢? 我试着将每个字符转换成UDI,但似乎没有特殊的分隔符或其他东西,所以我真的不知道该怎么办。是否有人有任何想法?
这是代码,如果有人想尝试任何操作https://prnt.sc/1x2sw8l 那些代码/产品直接来自制造商,所以代码应该没有问题,我猜...
4个回答

3
如果您使用一款专门用于解释GS1结构的扫描仪来验证条形码,您将会发现生成的条形码实际上是不正确的。
您遗漏了一个序列号后的GS码,如果这不是最后一个可变长度字段,这些代码必须结束一个可变长度字段。这在GS1通用规范第7.8.5.2节中有说明。
没有这个分隔符,您无法知道序列号在哪里结束,或者说,机器无法解释该代码。
请告诉制造商他们需要研究GS1规范
编辑: "正确"版本应该是:
(01)00380652555852(17)260221(21)25146965079<GS>(11)210222(240)SA60AT225

括号和组分隔符<GS>在代码中不是字面意义上的。
由于您有两个可变长度标识符(21)和(240),无论如何都需要一个GS。唯一的替代方案是为序列号添加一些填充,然后您可以不使用分隔符。

是的,我用Zebra TC25扫描器、一些安卓应用和一些在线解码器进行了测试,所有结果都相同。至少现在我知道问题不在设备上,而是代码的问题。感谢详细的解释! - yeetyeet
1
非终端AI的末尾,如果不是预定义的、不需要这种终止符的AI成员,则需要使用FNC1分隔符(由读取器作为GS字符传输)。大多数“固定长度”的AI实际上都需要FNC1终止。在需要FNC1终止的情况下,即使字段已经填满,也会包含它。原因是为编码器/解码器提供一个稳定的表格基础,独立于GenSpecs未来的更改。请参见此处的“*”条目:https://github.com/bwipp/postscriptbarcode/blob/master/contrib/development/gs1-format-spec.txt - Terry Burton

0

很抱歉我的英语不好 这个问题的原因是组分隔符是无法识别的字符,例如如果你在文本框中按下大写锁定键或Shift键,文本框中什么也不会出现,gs也是一样的。 要解决这个问题, 公共l为整数 并将以下代码放入keyup事件中

If textbox1.textlenght = l then
My.combuter.keybord.sendkeys({enter})
L= textbox1.textlenght
End if

这段代码将在每个字母后面添加一个空格(因为每个字母与大小写锁定按钮组合在一起),并在组间添加五个空格。


0
根据GS1文档(第156页及以后),所有字段都是正确的:
(01)00380652555852 --> GTIN
(17)260221 --> 过期日期
(21)25146965079 --> 序列号
(11)210222 --> 生产日期
(240)SA60AT225 --> 附加产品标识
我尝试扫描图像,但结果与您的相同。
因此,问题在于分隔符不存在。这对您来说是个问题,而且没有办法知道序列号在哪里结束,因为没有分隔符。

请记住,(11) 的定义是具有恰好6位数字,这意味着以下标识符将是(240)(附加项目信息),而不是(22)(顺便说一下,在标准中甚至没有定义)。 - MyICQ
哦,你说得对!有太多的“2”。我会修复它。 - Juan Sturla
顺便提一下,(22) 它在标准中有定义,是“消费品变体”。 - Juan Sturla

0

在KeyPress事件中存储原始输入,然后读取字母或数字字符。

        if (e.KeyChar != 13)
        {
            int asci = Convert.ToInt32(e.KeyChar);
            if (asci > 31 && asci < 128) // numeric and chars only
                rawbcode += Convert.ToChar((int)(e.KeyChar & 0xffff));             
            else
            {
                if (asci == 29)
                {
                    rawbcode += "<GS>"; // GS1 Seperator    
                }
            }
        }

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接