GS1条形码解析

11
我们需要解析由其他方提供的GS1数据矩阵条形码。我们知道他们将使用GTIN(01)、批号(10)、失效日期(17)和序列号(21)。问题在于,条形码读取器输出一个字符串,格式如下:01076123456789001710050310AC3453G321455777。由于没有分隔符,并且序列号和批号根据GS1标准具有可变长度,我们很难识别出各个段落。我的理解是,最好的解析方法似乎是将解析器嵌入到扫描设备中,而不是从应用程序中进行解析。但我们还没有计划嵌入式软件。如何实现解析器?任何建议?
2个回答

7
应在可变长度字段的末尾添加FNC1字符,以便在G321之间出现FNC1。
FNC1对人不可见,但可以被扫描器检测到,并且应该在扫描器报告的字符串中复制为GS字符(ASCII值29)。只需将字符串直接发送到文本文件并使用十六进制读取器检查文本即可。代表条形码FNC1分隔符的GS字符应该是明显的。
如果可能的话,可能会交换21字段和10字段的顺序,因为您似乎正在使用纯数字进行编码。21出现在前面会使生成的条形码稍微短一些。

1
我测试了02034531200000111709112510ABCD12343710,应该在10ABCD1234和3710之间有一个分隔符。我使用ASCII编码,并获取字符串的字节,ASCIIEncoding.GetBytes(barcodeString),它只读取了38个字节,字节流中仍然缺少FNC1。 - BackToSorrento
FNC1的缺失可能有很多原因。它可能没有出现在标签上,或者扫描仪没有发送它,或者您使用的软件没有正确处理它。我会尝试使用EAN手册中包含FNC1的已知良好条形码(不关心它们这周的名称是什么,这与问题无关)。然后尝试将该代码读入像notepad这样的程序中,它应该显示出额外的字符(无法测试,设备不在手边)。您还可以尝试编写一个接受原始字节并显示十六进制的程序 - 甚至读入cmd并创建一个文件,其中将具有 - Magoo
一个长度。如果您能够通过这些方法之一检测到EAN源中的FNC1,则表示读取器正常,否则请怀疑读取器。如果您可以在EAN的代码中找到FNC1但在您的代码中找不到,则请怀疑标签生产软件或设备。如果这些简单方法之一可以找到FNC1并且您确信标签是正确的,则请怀疑您的(大概)C#例程。 - Magoo
谢谢,Magoo。那是个好建议。我会保持你的更新。 - BackToSorrento
1
我测试的代码来自GS1手册,FNC1可以从我的iPhone扫描仪中看到。因此,我有非常充分的理由怀疑设备。我们决定讨论投资更复杂的设备。 - BackToSorrento
一个变长字段在未填满的情况下,末尾应该有一个FNC1字符。无论字段是否被填充,都需要满足FNC1的要求。FNC1应该应用于任何“变长”的非终端字段。(“变长”有点不准确:严格来说,GS1通用规范隐含地定义了一组不需要FNC1的AI列表,通过列出所有需要它们的字段并声明所有未来的定义也将需要它们来实现。) - Terry Burton

2

处理这个问题的一种方法是将扫描仪程序化,将FNC1替换为空格或其他纯文本字符,然后再发送到应用程序。扫描仪制造商通常提供一个工具来生成编程条形码,可以在扫描仪中进行简单的替换。这样,您就可以解析数据,而无需处理特殊字符。


1
传输协议严格定义 FNC1(除第一或第二个字符位置外)必须作为 GS 字符(ASCII 值 29)进行传输。因此,典型的替换是将 GS 字符转换为在 GS1 AI 值中无效的某些内容,例如 ~ - Terry Burton

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