2016-08-05 28 views
-1

Ich arbeite an einem Projekt, das Barcodes wie GS1 128 benötigt, und ich möchte sie in die Anwendungs-IDs (AI) trennen. Ich benutze eine Bibliothek namens Bark.js.GS1 128 Barcode-Decoder (AI) in PHP oder Jquery

Es funktioniert gut mit einigen Barcodes, mit AI wie 01, 02, 15, 17, 10; aber jetzt Barcodes wie ich finde:

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

Ok, lassen wir außer acht Klammern, weil Sie erscheinen nur im lesbaren Teil.

Ich nehme an, Sie wissen, dass einige AI variable Länge haben, in diesem Fall (37) und (10) haben zwischen 2-8 und 2-20 Ziffern. Mir geht es gut mit (10), weil es in fast allen Fällen das Ende ist. Aber (37) kann in der Mitte oder am Ende erscheinen.

Ich habe die Bark.js-Bibliothek gepatcht, aber ich bekomme diese Art von Steuerelement mit variabler Länge nicht.

Ich suche seit Wochen und ich finde nur Bibliotheken, um Barcodes zu erzeugen oder ein Bild zu lesen, aber sie lesen nicht den Barcode und verarbeiten ihn, der alle KI trennt.

Wissen all dies, gibt es eine andere Bibliothek in Javascript/Jquery oder PHP, um alle diese Fälle zu kontrollieren?

PS: Entschuldigung für mein Englisch, ich werde gerne auf Fragen zu beantworten.

+2

Bark.js hat offenbar keine Unterstützung für nicht druckbare FNCx Codes. Mein Verständnis ist, dass eine AI mit variabler Länge mit einem FNC1-Code enden muss. Wenn diese Codes nicht in Ihrer Eingabe erscheinen, stecken Sie irgendwie fest. [Diese Frage] (http://stackoverflow.com/questions/31318648/what-is-the-actual-hex-binary-value-of-the-gs1-fnc1-character) (und ihre angenommene Antwort) kann relevant enthalten Information. – Arnauld

+0

Kommt Ihre Eingabe von einem echten Barcodeleser oder wird sie manuell eingegeben? Und vor allem: Ist es irgendwie möglich, nicht druckbare FNCx-Codes einzubinden? – Arnauld

+0

@Arnauld Ich benutze einen Code-Bar-Reader, der in einem Tablet integriert ist, um in meinen Eingabetext zu schreiben. Normalerweise wird der Barcode nicht manuell eingegeben. Und ich habe keine Ahnung, ob es möglich ist, FNCx-Codes damit zu versehen. Ich sollte anders verwenden? Danke – bey23

Antwort

1

Um es zusammenzufassen, es stellt sich heraus, dass Sie die Application Identifiers (AI) in einem GS1 128 Barcode, der seine nicht druckbare FNCx Codes fehlt, dekodieren müssen. Da einige der AIs eine variable Länge haben und durch einen FNC1 Code begrenzt sein sollten, ist das Beste, was Sie tun können, Raten. (Ich bin kein Barcode-Experte, also zögern Sie bitte nicht, diese Antwort zu kommentieren, wenn meine Analyse falsch ist.)

Dies hinterlässt uns ein ziemlich interessantes Problem: Finden Sie alle mögliche gültige Decodierung Ergebnisse, eine Eingabe gegeben String und eine Liste von AI-Definitionen, die darin vorkommen können.

Unten ist mein Versuch, dieses Problem zu lösen.

Ich habe alle AI-Codes, die ursprünglich in Bark.js definiert wurden, mit den zusätzlichen AI-Codes versehen, die Sie bisher gefunden zu haben scheinen (mit den unter this page beschriebenen Formaten).

Dieser Algorithmus nimmt die Zeichenfolge '02984288445516973701003103022700151802051005165' als Eingabe und erzeugt die folgende Liste von Lösungen, in einer rekursiven Weise:

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 

Leider, das ist eine ziemlich lange Liste. Die richtige Lösung in Ihrem Fall scheint # 9 zu sein.

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 Es ist möglich, die Anzahl der Lösungen zu reduzieren, wenn wir davon ausgehen, dass derselbe AI-Code nicht zweimal in derselben Eingabe vorkommen kann. Weißt du, ob es wahr ist? – Arnauld