【问题标题】:GS1 128 Barcode Decoder (AI) in PHP or JqueryPHP 或 Jquery 中的 GS1 128 条码解码器 (AI)
【发布时间】:2016-08-05 10:54:31
【问题描述】:

我正在处理一个需要读取 GS1 128 等条形码的项目,我想将它们分成应用程序标识符 (AI)。我正在使用一个名为 Bark.js 的库。

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

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

好的,我们不考虑括号,因为它们只出现在人类可读的部分。

我假设您知道某些 AI 具有可变长度,在这种情况下,(37) 和 (10) 分别具有 2-8 和 2-20 位数字。我对 (10) 没意见,因为它几乎在所有情况下都结束了。但是 (37) 可以出现在中间或末尾。

我已经修补了 Bark.js 库,但我没有得到这种可变长度的控制。

我正在搜索一个星期,我只找到生成条形码或读取图像的库,但他们没有读取条形码并处理它以分离所有 AI。

了解了这一切,还有没有其他的 Javascript/Jquery 或 PHP 库来控制所有这些情况??

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

【问题讨论】:

  • Bark.js 显然不支持不可打印的 FNCx 代码。我的理解是可变长度的 AI 必须以 FNC1 代码结尾。如果这些代码没有出现在您的输入中,那么您就会陷入困境。 This question(及其接受的答案)可能包含相关信息。
  • 您的输入是来自真正的条形码阅读器还是手动输入?最重要的是:是否可以在其中包含不可打印的 FNCx 代码?
  • @Arnauld 我使用集成在平板电脑中的条码阅读器来写入我的输入类型文本。通常条形码不是手动输入的。而且我不知道是否可以包含 FNCx 代码。我应该使用其他方式吗?谢谢
  • 平板电脑的文档可能提供了一种输出 FNCx 代码的方法。如果不可能,我能想到的最佳解决方案是列出所有可能的有效解码结果,给定输入字符串和其中可能遇到的 AI 定义列表。如果幸运的话,大多数时候可能只有一种结果。
  • @Arnauld 平板电脑使用“BarcodScanWizard”插件进行阅读,它非常简单,没有文档,无法用它做任何事情。正如你所说,我将继续对 Bark.js 进行修补以获取几个案例。谢谢你的建议:)

标签: javascript php jquery barcode


【解决方案1】:

总而言之,您需要对缺少不可打印的FNCx 代码的 GS1 128 条码中的应用程序标识符 (AI) 进行解码。由于某些 AI 具有可变长度并且应该由 FNC1 代码分隔,因此您能做的最好的事情就是猜测。 (我不是条形码专家,所以如果我的分析不正确,请不要犹豫评论这个答案。)

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

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

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

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

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。

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);
});

【讨论】:

  • @bey23 如果我们假设相同的 AI 代码不能在相同的输入中出现两次,则可以减少解决方案的数量。不知道是不是真的?
猜你喜欢
  • 2016-09-13
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
相关资源
最近更新 更多