2016-08-05 1 views
-1

Я работаю над проектом, который требует чтения штрих-кодов, таких как GS1 128, и я хочу разделить их на идентификаторы приложений (AI). Я использую библиотеку под названием Bark.js.GS1 128 Barcode Decoder (AI) в PHP или JQuery

Он отлично работает с некоторыми штрих-кодами, используя AI, например, 01, 02, 15, 17, 10; но теперь я нахожу, штрих-коды, как:

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

Ok, мы выходим из счета скобок, потому что они появляются только в читаемой части человека.

Я предполагаю, что вы знаете, что некоторые ИИ имеют переменную длину, в этом случае (37) и (10) имеют между 2-8 и 2-20 цифрами соответственно. Я в порядке с (10), потому что это конец почти во всех случаях. Но (37) может появиться в середине или в конце.

Я закрепил библиотеку Bark.js, но я не получаю такой контроль с переменной длиной.

Я ищу несколько недель, и я только нахожу библиотеки для создания штрих-кодов или чтения изображения, но они не читают штрих-код и обрабатывают его, разделяя все AI.

Зная все это, есть ли другая библиотека в Javascript/JQuery или PHP для управления всеми этими случаями ??

PS: Извините за мой английский, я буду рад ответить на любые вопросы.

+2

Bark.js по-видимому, не имеет поддержки непечатаемых кодов FNCx. Я понимаю, что AI переменной переменной длины должен заканчиваться кодом FNC1. Если эти коды не отображаются на вашем входе, вы как бы застряли. [Этот вопрос] (http://stackoverflow.com/questions/31318648/what-is-the-actual-hex-binary-value-of-the-gs1-fnc1-character) (и его принятый ответ) может содержать соответствующие Информация. – Arnauld

+0

Используется ли ваш вход от реального считывателя штрих-кодов или он вводится вручную? И самое главное: можно ли как-то включить туда непечатаемые коды FNCx? – Arnauld

+0

@Arnauld Я использую считыватель кода, который интегрирован в планшет, для записи в тексте ввода. Обычно штрих-код не вводится вручную. И я понятия не имею, можно ли с ними включать коды FNCx. Я должен использовать другой путь? Спасибо – bey23

ответ

1

Подводя итог, выясняется, что вам необходимо декодировать идентификаторы приложений (AI) внутри штрих-кода GS1 128, в котором отсутствуют его непечатаемые коды FNCx. Поскольку некоторые из ИИ имеют переменную длину и должны быть разделены кодом FNC1, лучшее, что вы можете сделать, это угадать. (Я не эксперт по штрих-коду, поэтому, пожалуйста, не стесняйтесь комментировать этот ответ, если мой анализ неверен.)

Это оставляет нам довольно интересную проблему: найдите все возможные действительные результаты декодирования, учитывая ввод строка и список определений AI, которые могут встречаться в ней.

Ниже я попытался решить эту проблему.

Я включил все коды AI, которые были первоначально определены в Bark.js, дополненные дополнительными кодами 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); 
 
});

+0

@ bey23 Можно уменьшить количество решений, если исходить из предположения, что один и тот же код AI не может появляться дважды на одном и том же входе. Знаете ли вы, правда ли это? – Arnauld