首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GS1 128个条形码解码器(AI)

GS1 128个条形码解码器(AI)
EN

Stack Overflow用户
提问于 2016-08-05 10:54:31
回答 1查看 2.8K关注 0票数 0

我正在从事一个需要读取条形码(如GS1 128 )的项目,我希望将它们分离到应用程序标识符(AI)中。我正在使用一个名为Bark.js的库。

它适用于一些条形码,使用AI (如01、02、15、17、10);但现在我发现条形码如下:

(02) 98428844551697 (37) 0100 (3103) 022700 (15) 180205 (10) 05165

好的,我们忽略了括号,因为它们只出现在人类可读的部分。

我假设你知道一些AI有可变的长度,在这种情况下(37)和(10)分别有2-8和2-20位数。我同意(10),因为在几乎所有的情况下,它都是结束的。但(37)可以出现在中间或最后。

我已经对Bark.js库进行了修补,但是我无法获得这种可变长度的控件。

我搜索了一个星期,我只找到库生成条形码或读取图像,但他们没有读取条形码和处理它分离所有人工智能。

知道了这一切之后,Javascript/Jquery或PHP中还有其他库来控制所有这些情况吗?

对不起我的英语,我很乐意回答你的任何问题。

EN

回答 1

Stack Overflow用户

发布于 2016-08-05 13:15:48

总之,您需要解码GS1 128条形码中的应用程序标识符(AI),该条形码缺少不可打印的FNCx代码。因为有些AIs有可变的长度,应该用FNC1代码分隔,所以最好的方法就是猜测。(我不是条形码专家,所以如果我的分析不正确,请不要犹豫地评论这个答案。)

这给我们留下了一个非常有趣的问题:给定输入字符串和可能遇到的AI定义列表,找到所有可能的有效解码结果。

下面是我解决这个问题的尝试。

我已经包含了最初在Bark.js中定义的所有AI代码,并使用了您到目前为止似乎遇到的额外AI代码(使用此页上描述的格式)。

该算法以字符串'02984288445516973701003103022700151802051005165'作为输入,并以递归方式生成以下解决方案列表:

代码语言:javascript
运行
复制
Solution #1: (02)98428844551697(37)0(10)0(310)3022700(15)180205(10)05165
Solution #2: (02)98428844551697(37)0(10)03(10)302270(01)51802051005165
Solution #3: (02)98428844551697(37)0(10)03(10)3022700(15)180205(10)05165
Solution #4: (02)98428844551697(37)0(10)03(10)302270015180205(10)05165
Solution #5: (02)98428844551697(37)0(10)0310302270(01)51802051005165
Solution #6: (02)98428844551697(37)0(10)03103022700(15)180205(10)05165
Solution #7: (02)98428844551697(37)0(10)0310302270015180205(10)05165
Solution #8: (02)98428844551697(37)01(00)310302270015180205(10)05165
Solution #9: (02)98428844551697(37)0100(310)3022700(15)180205(10)05165
Solution #10: (02)98428844551697(37)01003(10)302270(01)51802051005165
Solution #11: (02)98428844551697(37)01003(10)3022700(15)180205(10)05165
Solution #12: (02)98428844551697(37)01003(10)302270015180205(10)05165

不幸的是,这是一个相当长的名单。在您的情况下,正确的解决方案似乎是#9。

代码语言:javascript
运行
复制
var aiDef = {        // the AI data format is encoded as either:
  '00' : 18,         //  - fixed length   : N
  '01' : 14,         //  - variable length: [ MIN, MAX ] 
  '02' : 14,
  '10' : [ 1, 20 ],
  '11' : 6,
  '12' : 6,
  '13' : 6,
  '15' : 6,
  '16' : 6,
  '17' : 6,
  '310': 7,
  '37' : [ 1, 8 ]
};

function decode(str) {
  var res = [];

  recurse(str, '', res);
  return res;
}

function recurse(str, path, res) {
  // push solution path if we've successfully
  // made it to the end of the string
  if(str == '') {
    res.push(path);
    return;
  }

  var i, j, ai, code;

  // find next AI code
  for(
    i = 0, ai = void(0);
    i < str.length && (ai = aiDef[code = str.substr(0, i)]) === undefined;
    i++
  ) {}

  if(ai !== undefined) {
    // recode AI definition to unique format [ MIN, MAX ]
    ai = typeof ai == 'object' ? ai : [ ai, ai ];

    // iterate on all possible lengths and perform recursive call
    for(j = ai[0]; j <= ai[1]; j++) {
      if(i + j <= str.length) {
        recurse(str.substr(i + j), path + '(' + code + ')' + str.substr(i, j), res);
      }
    }
  }
}

var res = decode('02984288445516973701003103022700151802051005165');

res.forEach(function(r, i) {
  console.log('Solution #' + (i + 1) + ': ' + r);
});

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38787510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档