如何用Expo条码扫描器判断GS1批号的结束位置?
GS1批号识别问题解决思路
在GS1标准中,批号以10开头,长度最多为20位,其结束由不可见的FNC1符号标识,当前代码仅能处理空格分隔的场景,无法识别FNC1符号来判断批号结束位置,求解决思路?
原实现代码:
function getCode(code, pos, len){ let str = '' for(pos; pos < len + pos; pos++){ str+=code[pos] if(str[pos+1] === ' '){ break; } } }
解决思路及修改方案
- 明确FNC1的实际编码:GS1体系里的FNC1通常对应ASCII码29(组分隔符GS),先确认你拿到的
code字符串中,FNC1是以什么形式存在的——是直接的控制字符,还是扫描器转义后的特定标识。 - 调整终止判断逻辑:把原代码仅判断空格的条件,改成同时兼容FNC1和空格,再加上GS1标准的20位长度限制兜底,避免超出标准或越界:
function getCode(code, pos, len){ let str = ''; // 这里用ASCII 29代表FNC1,根据实际扫描输出调整 const FNC1 = String.fromCharCode(29); // 批号最多20位,取传入len和20的最小值作为循环上限 const maxCount = Math.min(len, 20); for(let i = 0; i < maxCount; i++){ const currentIndex = pos + i; // 防止数组越界提前终止 if(currentIndex >= code.length) break; str += code[currentIndex]; // 检查下一个字符是否是FNC1或空格,同时确保不越界 if(currentIndex + 1 < code.length){ const nextChar = code[currentIndex + 1]; if(nextChar === FNC1 || nextChar === ' '){ break; } } } return str; } - 适配扫描器输出差异:如果你的条码扫描器输出的FNC1不是纯ASCII 29,而是带有前缀(比如
]C1),需要针对性调整匹配逻辑,比如判断后续字符是否符合扫描器的输出格式。
内容的提问来源于stack exchange,提问作者Janjac
相关产品推荐
相关产品推荐

