如何解析带有应用标识符的2D条码扫描返回数据?
解析GS1 2D条码字段的方案
核心逻辑:基于应用标识符(AI)的规则解析
你遇到的是GS1标准的2D条码(如DataMatrix、GS1 QR Code),这类条码的结构是应用标识符(AI)+对应数据的串联,可变长度字段会用FNC1字符(ASCII值29,通常显示为GS)作为分隔符。针对你给出的示例0112345678901234112207281012345,拆解步骤如下:
1. 明确目标AI的长度规则
先梳理你用到的几个AI的固定/可变长度规则:
01:对应GTIN(产品编码),固定14位数据,AI+数据总长度为16位11:对应生产日期,固定6位(格式为YYMMDD),AI+数据总长度为8位10:对应批号,可变长度(最多20位),若为条码最后一个字段则无需FNC1;若后续还有字段,会用FNC1分隔
2. 分步解析示例字符串
以你的示例条码字符串为例,逐段拆解:
- 第一步:从开头截取
01,其后14位12345678901234即为产品编码 - 第二步:剩余字符串为
112207281012345,截取开头11,其后6位220728即为生产日期(对应2022年7月28日) - 第三步:剩余字符串为
1012345,截取开头10,其后所有内容12345即为批号
3. 处理带FNC1的多字段场景
如果条码包含更多字段,可变长度AI(如10批号)后会跟随FNC1分隔下一个AI。例如字符串011234567890123410ABCDEGS11220728(GS代表FNC1):
- 解析完
01对应的产品编码后,剩余字符串为10ABCDEGS11220728 - 读取
10后,遇到GS停止,得到批号ABCDE - 跳过
GS,继续解析11对应的生产日期220728
4. 代码实现思路(伪代码)
def parse_gs1_barcode(barcode_str): parsed_result = {} current_index = 0 total_length = len(barcode_str) while current_index < total_length: # 读取2位AI(你用到的AI均为2位,若涉及其他AI需调整长度判断) ai = barcode_str[current_index:current_index+2] current_index += 2 if ai == '01': # GTIN固定14位 data = barcode_str[current_index:current_index+14] parsed_result['产品编码(GTIN)'] = data current_index += 14 elif ai == '11': # 生产日期固定6位 data = barcode_str[current_index:current_index+6] parsed_result['生产日期'] = data current_index += 6 elif ai == '10': # 批号:读到字符串结尾或FNC1(ASCII 29)为止 fnc1_pos = barcode_str.find(chr(29), current_index) if fnc1_pos == -1: fnc1_pos = total_length data = barcode_str[current_index:fnc1_pos] parsed_result['批号'] = data current_index = fnc1_pos + (1 if fnc1_pos != total_length else 0) return parsed_result # 测试示例条码 test_barcode = "0112345678901234112207281012345" print(parse_gs1_barcode(test_barcode))
额外建议
优先检查你的扫描器配置:部分专业条码扫描器支持直接配置AI解析规则,扫描后自动输出带分隔符(如逗号)的字段内容,无需自行开发解析逻辑,这是最高效的方案,可查看扫描器说明书或配置工具确认。
内容的提问来源于stack exchange,提问作者Schlem
相关产品推荐
相关产品推荐

