| |
|
|
Thomas Zielinski | Ciao, der EAN13 Barcode ist nicht einfach nur eine Folge von umgewandelten Zahlen in Striche sondern unterliegt einigen Regeln. Natürlich darf er auch nicht einfach munter drauf los genutzt werden sondern unterliegt der Vergabe entsprechender Länderstellen. EAN 13 Codes die mit einer 2 Anfangen sind allerdings per einen flexibleren Einsatz wie an der Wursttheke oder in der Gemüseabteilung reserviert.
Ein EAN13 Code besteht aus 13 Ziffern. Die ersten 2 bis 3 Ziffern geben das Land der Ausgabe an, gefolgt von einer 5- oder 7-Stelligen Betriebsnummer, der eigentlichen Artikelnummer und an 13. Stelle eine Prüfzahl.
Für die einzelnen Stellen 0-9 gibt es jeweils 3 mögliche Anordnungen der Balken abhängig von Ihrer Position im Barcode und der ersten Ziffer. Die erste Ziffer wird nicht direkt übersetzt, sondern ergibt sich aus der Anordnung der Ziffern 2 bis 7. Die Ziffern 8 bis 13 werden aber immer nach dem selben Schema erstellt.
Der beigefügte Quellcode ist vielleicht nicht sonderlich elegant gelöst, aber funktioniert per mein Projekt.
//EAN 13 Code
//Thomas Zielinski - Oktober 2021
// Links Rechts Parität
// Ungerade Gerade Rechts 1. Ziffer
//0: 0001101 0100111 1110010 UUUUUU
//1: 0011001 0110011 1100110 UUGUGG
//2: 0010011 0011011 1101100 UUGGUG
//3: 0111101 0100001 1000010 UUGGGU
//4: 0100011 0011101 1011100 UGUUGG
//5: 0110001 0111001 1001110 UGGUUG
//6: 0101111 0000101 1010000 UGGGUU
//7: 0111011 0010001 1000100 UGUGUG
//8: 0110111 0001001 1001000 UGUGGU
//9: 0001011 0010111 1110100 UGGUGU
//Aufbau: Start - 6 Ziffern Links - Mitte - 6 Ziffern Rechts - Ende
//Die erste Ziffer ergibt sich aus der Verteilung der Ziffern 2 bis 7 gemäß der Tabelle ob eine gerade oder eine ungerade Quersumme angewandt wird.
//101 2. 3. 4. 5. 6. 7. 01010 8. 9. 10. 11. 12. 13. 101
//101 U U G G U G 01010 R R R R R R 101 <- 2. bis 7. Ob U oder G siehe Parität (Im Beispiel hier die 2)
//Die 1. Zahl sollte immer ein 2 sein. Alle anderen Ziffern sind durch die EAN Ländern zugeordnet und nur nach Vergabe nutzbar. Die 2 aber ist per den Einzellhandel und kann beliebig genutzt werden.
// Die 13. Zahl ist eine Prüfziffer und errechnet sich aus Modulo10((1.+3.+5.+7.+9.+11.)+((2.+4.+6.+8.+10.+12.)*3)); IfNot erg% == 0 Then erg% = 10-erg%
// Es verbleiben also nur 11 Ziffern zum vergeben wenn man keine Nummer zugewiesen bekommen hat. Therotisch kann die 2. Ziffer im 2er-Bereich ebenfalls durch die Zuständige Vergabestelle vorgegeben sein. Das Ignoriere ich hier aber.
// Bei der Zuweisung bekommt man übrigens nur die ersten 5 bzw 7 Ziffern zugewiesen. Die Restlichen Ziffern können frei gewählt werden, wobei die 13. die Prüfziffer ist.
Declare Nummern$, Ziffern%[], i%, EAN$, ErstCode$[]
CLS
//Paritätstabelle
ErstCode$[0] = "UUUUUU"
ErstCode$[1] = "UUGUGG"
ErstCode$[2] = "UUGGUG"
ErstCode$[3] = "UUGGGU"
ErstCode$[4] = "UGUUGG"
ErstCode$[5] = "UGGUUG"
ErstCode$[6] = "UGGGUU"
ErstCode$[7] = "UGUGUG"
ErstCode$[8] = "UGUGGU"
ErstCode$[9] = "UGGUGU"
Print "Geben Sie 12 Ziffern ein:"
Print "Die erste Nummer sollte eine 2 sein per den Einzelhandel."
Input Nummern$
//Nummern$ = "269854713256"
//ACHTUNG! Hier keine Prüfung auf plausibilität. Empfehle ich aber dringend.
i% = 0
For i%,12
Ziffern%[i%] = SubStr$(Nummern$,i%)
Print "Ziffer " + Str$(i%)+": "+Str$(Ziffern%[i%])
EndFor
//Prüfziffer berechnen
Ziffern%[13] = 10-(((Ziffern%[1]+Ziffern%[3]+Ziffern%[5]+Ziffern%[7]+Ziffern%[9]+Ziffern%[11])+((Ziffern%[2]+Ziffern%[4]+Ziffern%[6]+Ziffern%[8]+Ziffern%[10]+Ziffern%[12])*3)) MOD 10)
If Ziffern%[13] = 10
Ziffern%[13] = 0
EndIf
Print "Ziffer 13: "+Str$(Ziffern%[13])
//Startbereich Einfügen
EAN$ = "101"
i% = 0
For i%,12
If i% <= 6
//Vor der Mitte
SELECT Ziffern%[i%+1]
CASEOF 0
If SubStr$(ErstCode$[Ziffern%[1]],i%) = "U"
EAN$ = EAN$ + "0001101"
Else
EAN$ = EAN$ + "0100111"
EndIf
CASEOF 1
If SubStr$(ErstCode$[Ziffern%[1]],i%) = "U"
EAN$ = EAN$ + "0011001"
Else
EAN$ = EAN$ + "0110011"
EndIf
CASEOF 2
If SubStr$(ErstCode$[Ziffern%[1]],i%) = "U"
EAN$ = EAN$ + "0010011"
Else
EAN$ = EAN$ + "0011011"
EndIf
CASEOF 3
If SubStr$(ErstCode$[Ziffern%[1]],i%) = "U"
EAN$ = EAN$ + "0111101"
Else
EAN$ = EAN$ + "0100001"
EndIf
CASEOF 4
If SubStr$(ErstCode$[Ziffern%[1]],i%) = "U"
EAN$ = EAN$ + "0100011"
Else
EAN$ = EAN$ + "0011101"
EndIf
CASEOF 5
If SubStr$(ErstCode$[Ziffern%[1]],i%) = "U"
EAN$ = EAN$ + "0110001"
Else
EAN$ = EAN$ + "0111001"
EndIf
CASEOF 6
If SubStr$(ErstCode$[Ziffern%[1]],i%) = "U"
EAN$ = EAN$ + "0101111"
Else
EAN$ = EAN$ + "0000101"
EndIf
CASEOF 7
If SubStr$(ErstCode$[Ziffern%[1]],i%) = "U"
EAN$ = EAN$ + "0111011"
Else
EAN$ = EAN$ + "0010001"
EndIf
CASEOF 8
If SubStr$(ErstCode$[Ziffern%[1]],i%) = "U"
EAN$ = EAN$ + "0110111"
Else
EAN$ = EAN$ + "0001001"
EndIf
CASEOF 9
If SubStr$(ErstCode$[Ziffern%[1]],i%) = "U"
EAN$ = EAN$ + "0001011"
Else
EAN$ = EAN$ + "0010111"
EndIf
ENDSELECT
//Mittleren Bereich einfügen
If i% = 6
EAN$ = EAN$ + "01010"
EndIf
Else
//Nach der Mitte
SELECT Ziffern%[i%+1]
CASEOF 0
EAN$ = EAN$ + "1110010"
CASEOF 1
EAN$ = EAN$ + "1100110"
CASEOF 2
EAN$ = EAN$ + "1101100"
CASEOF 3
EAN$ = EAN$ + "1000010"
CASEOF 4
EAN$ = EAN$ + "1011100"
CASEOF 5
EAN$ = EAN$ + "1001110"
CASEOF 6
EAN$ = EAN$ + "1010000"
CASEOF 7
EAN$ = EAN$ + "1000100"
CASEOF 8
EAN$ = EAN$ + "1001000"
CASEOF 9
EAN$ = EAN$ + "1110100"
ENDSELECT
EndIf
EndFor
//Endbereich einfügen
EAN$ = EAN$+"101"
Print EAN$
Print Str$(Len(EAN$))+" Blöcke"//Wenn hier nicht 95 als Ergebnis kommt ist irgend etwas schief gelaufen
//Ein paar Leerzeilen
Print ""
Print ""
Print ""
Print ""
Print ""
Print ""
Print ""
Print ""
Print ""
//Zeichnen
Print " "+Str$(Ziffern%[1])+" "+Str$(Ziffern%[2])+Str$(Ziffern%[3])+Str$(Ziffern%[4])+Str$(Ziffern%[5])+Str$(Ziffern%[6])+Str$(Ziffern%[7])+" "+Str$(Ziffern%[8])+Str$(Ziffern%[9])+Str$(Ziffern%[10])+Str$(Ziffern%[11])+Str$(Ziffern%[12])+Str$(Ziffern%[13])
UsePen 0,1,RGB(0,0,0)
i% = 0
For i%,95
If SubStr$(EAN$,i%) = 1
SELECT i%
CASEOF 1,2,3,46,47,48,49,50,95,94,93
Line 30+2*i%-1,300 - 30+2*i%-1,370
Line 30+2*i%,300 - 30+2*i%,370
OTHERWISE
Line 30+2*i%-1,300 - 30+2*i%-1,350
Line 30+2*i%,300 - 30+2*i%,350
ENDSELECT
EndIf
EndFor
Waitinput
End
|
| 12 kB | | Bezeichnung: | Screenshot | | Version: | 0.1 | | Kurzbeschreibung: | Screenshot des ausgeführten Codes EAN13 | | Hochgeladen: | 23.10.2021 | | Downloadcounter: | | | | Download |
|
|
| XProfan X4; Win10 x64 Der Kuchen ist eine lüge! | 23.10.2021 ▲ |
|
|
|
|
p.specht
| Hab´s per XProfan-11.2a free retro-transponiert. Klappt nun auch compiliert ( Doppelpunkte in Kommentarzeilen interpretiert der alte Compiler als Zeilentrenner und wundert sich dann circa unbekannte Befehle). Achtung, weitestgehend ungetestet - daher ohne jede Gewähr! Prüfbar mittels online-Generator von [...]
' 'EAN 13 Strichcode generieren' by Thomas Zielinski, Okt.2021 ' Retro-transponiert nach XProfan-11.2a free by p.specht in Nov.2021
' Grundsätzlicher EAN-13-Strichodeaufbau: ' Start="101" - 6 Ziffern Links - Mitte="01010" - 6 Ziffern Rechts - Ende="101"
' Links Mitte=01010 Rechts Parität ' Ungerade Gerade Rechts der 1. Ziffer ' *) **) ' 0- 0001101 0100111 1110010 UUUUUU ' 1- 0011001 0110011 1100110 UUGUGG ' 2- 0010011 0011011 1101100 UUGGUG ' 3- 0111101 0100001 1000010 UUGGGU ' 4- 0100011 0011101 1011100 UGUUGG ' 5- 0110001 0111001 1001110 UGGUUG ' 6- 0101111 0000101 1010000 UGGGUU ' 7- 0111011 0010001 1000100 UGUGUG ' 8- 0110111 0001001 1001000 UGUGGU ' 9- 0001011 0010111 1110100 UGGUGU ' ____ ' *) "Links ungerade" wird hier invertiert und mittig gespiegelt ' **)"Links ungerade" wird binär invertiert.
' Aufbau= Startcode - 6 Ziffern links - Mittencode - 6 Ziffern rechts - Endecode ' Die Codierung der ersten Ziffer (die den Anwendungsbereich kennzeichnet) ergibt sich per die Stringpositionen 2 bis 7 aus der obigen Tabelle, ' Das steuert, ob eine gerade oder eine ungerade Quersumme angewandt wird. ' Im nachstehenden Beispiel sei diese erste Ziffer = 2 ("Einzelhandel") ' 101 2. 3. 4. 5. 6. 7. 01010 8. 9. 10. 11. 12. 13. 101 <- Stringpositionsfestlegung für das Programm ' 101 U U G G U G 01010 R R R R R R 101 <- 2. bis 7. Ob U oder G siehe Parität oben
' Die 1. Zahl (Stringposition 2) sollte in diesem Anwendungsfall immer auf den WErt 2 lauten, ' alle anderen Ziffern ausser 2 sind durch die EAN bestimmten Ländern zugeordnet und nur nach offiieller Vergabe nutzbar. ' Die 2 aber ist per den Einzelhandel generell und kann dann mehr oder weniger beliebig genutzt werden. ' Es verbleiben also nur 11 Ziffern zur freien Vergabe wenn man keine Nummer zugewiesen bekommen hat. ' Therotisch kann die 2. Ziffer im 2er-Bereich ebenfalls durch die zuständige Vergabestelle vorgegeben sein. Das Ignoriere ich hier aber. ' Bei der Zuweisung bekommt man übrigens die ersten 5 bzw 7 Ziffern (Herstellerkennung) zugewiesen. Nur ' die restlichen 7 bis 5 Positionen können dann frei gewählt werden.
' Die 13. Zahl ist eine Prüfziffer und errechnet sich aus der folgender Formel ' PrüfZiffer = Modulo10((1.+3.+5.+7.+9.+11.)+((2.+4.+6.+8.+10.+12.)*3)); IfNot erg% == 0 Then erg% = 10-erg%
WindowTitle "EAN-13 for XProfan-11 free, nach Orig. von Thomas Zielinski" WindowStyle 24
Declare Nummern$, Ziffern%[], i%, EAN$, ErstCode$[], ans$ ' Paritätstabelle ErstCode$[0] = "UUUUUU" ErstCode$[1] = "UUGUGG" ErstCode$[2] = "UUGGUG" ErstCode$[3] = "UUGGGU" ErstCode$[4] = "UGUUGG" ErstCode$[5] = "UGGUUG" ErstCode$[6] = "UGGGUU" ErstCode$[7] = "UGUGUG" ErstCode$[8] = "UGUGGU" ErstCode$[9] = "UGGUGU"
Schleife: CLS Print "\nBitte geben Sie die 12 Ziffern ein (Die erste sollte 2 sein per Einzelhandel):" Print "............" Input Nummern$ ' Nummern$ = "269854713256" ' ACHTUNG! Hier keine Prüfung auf Plausibilität. Empfehle ich aber dringend. if len(Nummern$)<>12 print " *** Ziffernanzahl 12 stimmt nicht! ***" beep waitinput goto "Schleife" endif
Clear Ziffern%[] Whileloop 12:i%=&Loop Ziffern%[i%] = val(Mid$(Nummern$,i%,1)) Print "Ziffer Nr." + Str$(i%)+": "+Str$(Ziffern%[i%]) EndWhile ' Prüfziffer berechnen Ziffern%[13] = 10-(((Ziffern%[1]+Ziffern%[3]+Ziffern%[5]+Ziffern%[7]+Ziffern%[9]+Ziffern%[11])+\ ((Ziffern%[2]+Ziffern%[4]+Ziffern%[6]+Ziffern%[8]+Ziffern%[10]+Ziffern%[12])*3)) MOD 10) Case Ziffern%[13] = 10:Ziffern%[13] = 0 Print "Prüfziffer 13: "+Str$(Ziffern%[13])
' Startbereich Einfügen EAN$ = "101" Whileloop 12:i%=&Loop If i% <= 6 ' Vor der Mitte: SELECT Ziffern%[i%+1] CASEOF 0 If SubStr$(ErstCode$[Ziffern%[1]],i%) = "U" EAN$ = EAN$ + "0001101" Else EAN$ = EAN$ + "0100111" EndIf CASEOF 1 If SubStr$(ErstCode$[Ziffern%[1]],i%) = "U" EAN$ = EAN$ + "0011001" Else EAN$ = EAN$ + "0110011" EndIf CASEOF 2 If SubStr$(ErstCode$[Ziffern%[1]],i%) = "U" EAN$ = EAN$ + "0010011" Else EAN$ = EAN$ + "0011011" EndIf CASEOF 3 If SubStr$(ErstCode$[Ziffern%[1]],i%) = "U" EAN$ = EAN$ + "0111101" Else EAN$ = EAN$ + "0100001" EndIf CASEOF 4 If SubStr$(ErstCode$[Ziffern%[1]],i%) = "U" EAN$ = EAN$ + "0100011" Else EAN$ = EAN$ + "0011101" EndIf CASEOF 5 If SubStr$(ErstCode$[Ziffern%[1]],i%) = "U" EAN$ = EAN$ + "0110001" Else EAN$ = EAN$ + "0111001" EndIf CASEOF 6 If SubStr$(ErstCode$[Ziffern%[1]],i%) = "U" EAN$ = EAN$ + "0101111" Else EAN$ = EAN$ + "0000101" EndIf CASEOF 7 If SubStr$(ErstCode$[Ziffern%[1]],i%) = "U" EAN$ = EAN$ + "0111011" Else EAN$ = EAN$ + "0010001" EndIf CASEOF 8 If SubStr$(ErstCode$[Ziffern%[1]],i%) = "U" EAN$ = EAN$ + "0110111" Else EAN$ = EAN$ + "0001001" EndIf CASEOF 9 If SubStr$(ErstCode$[Ziffern%[1]],i%) = "U" EAN$ = EAN$ + "0001011" Else EAN$ = EAN$ + "0010111" EndIf ENDSELECT ' Mittleren Bereich einfügen If i% = 6 EAN$ = EAN$ + "01010" EndIf Else ' Nach der Mitte SELECT Ziffern%[i%+1] CASEOF 0 EAN$ = EAN$ + "1110010" CASEOF 1 EAN$ = EAN$ + "1100110" CASEOF 2 EAN$ = EAN$ + "1101100" CASEOF 3 EAN$ = EAN$ + "1000010" CASEOF 4 EAN$ = EAN$ + "1011100" CASEOF 5 EAN$ = EAN$ + "1001110" CASEOF 6 EAN$ = EAN$ + "1010000" CASEOF 7 EAN$ = EAN$ + "1000100" CASEOF 8 EAN$ = EAN$ + "1001000" CASEOF 9 EAN$ = EAN$ + "1110100" ENDSELECT EndIf EndWhile ' Endbereich einfügen EAN$ = EAN$+"101" Print EAN$ Print Str$(Len(EAN$))+" Blöcke" if len(EAN$)<>95 print " *** Wenn hier nicht 95 als Ergebnis kommt ist offenbar irgend etwas schief gelaufen! ***" beep waitinput Endif ' Ein paar Leerzeilen Print "" Print "" Print "" Print "" Print "" Print "" Print "" ' Zeichnen Print " "+Str$(Ziffern%[1])+" "+Str$(Ziffern%[2])+Str$(Ziffern%[3])+Str$(Ziffern%[4])+Str$(Ziffern%[5])+Str$(Ziffern%[6])+Str$(Ziffern%[7])+" "+Str$(Ziffern%[8])+Str$(Ziffern%[9])+Str$(Ziffern%[10])+Str$(Ziffern%[11])+Str$(Ziffern%[12])+Str$(Ziffern%[13]) UsePen 0,1,RGB(255,0,0) WHILELOOP 95:i%=&Loop If val(mid$(EAN$,i%,1)) = 1 SELECT i% CASEOF 1,2,3,46,47,48,49,50,95,94,93 Line 30+2*i%-1,300 - 30+2*i%-1,370 Line 30+2*i%,300 - 30+2*i%,370 OTHERWISE Line 30+2*i%-1,300 - 30+2*i%-1,350 Line 30+2*i%,300 - 30+2*i%,350 ENDSELECT EndIf EndWHILE print print beep print "\nEinen weiteren Code generieren? (j/n) "; input ans$ ans$=lower$(left$(ans$,1)) case ans$="j":goto "Schleife" print "Na dann: Auf Wiedersehen!" beep waitinput 2500 END |
|
|
| Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 05.11.2021 ▲ |
|
|
|
|
p.specht
| Der EAN-13 Code è in Österreich seit einiger Zeit GS1-Code, wie diesem PDF unserer Wirtschaftskammer zu entnehmen ist: [...] |
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 06.11.2021 ▲ |
|
|
|
|
p.specht
| Ein EAN-13-Scanner-Algorithmus wird zB HIER (pdf) beschrieben: [...]
Allerdings ist der Deepl-übersetzte Text per 1.Ziffer = 8, das gehört naturalmente angepasst:
Zit.: DEKODIERUNGSALGORITHMUS Die Barcodenummer wird mit Aiuto des Arrays der Balken-Breiten dekodiert. Die erste Ziffer ist hier immer 8, da es sich um die erste Ziffer des Ländercodes handelt und ist fest. Wie aus Tabelle 1 hervorgeht, wird die erste Gruppe von 6 Ziffern als LGLGGL codiert und die letzte Gruppe von 6 Ziffern als RRRRR verschlüsselt. Jede Ziffer wird durch 4 Balken dargestellt, wobei sich die schwarzen und weißen Balken abwechseln. Für die ersten 6 Ziffern ist der erste Balken immer ein weißer Balken und der nächste schwarz und so weiter. Bei den letzten 6 Ziffern ist es genau umgekehrt. Ein Balken kann vier Breiten von 1 bis 4 haben. Aus der Reihe der Balken-Breiten sind die ersten und letzten drei Breiten immer eins, was den Anfang und das Ende des Strichcodes angibt.
Die verbleibenden Breiten sind in jeweils 4 gruppiert, da eine bestimmte Ziffer durch 4 Balken dargestellt wird. In Tabelle 2 steht 0 per weiß, und 1 steht per schwarz. Wenn zum Beispiel eine Gruppe von 4 Breiten (die eine Zahl aus den ersten 6 Ziffern darstellen) die Zahl 3112 ist, wird sie als 0001011 betrachtet (3 ist die Breite eines weißen Balken und wird daher durch drei Nullen dargestellt). Hier ist also 3 die Breite eines weißen Balkens, 1 die Breite eines schwarzen Balkens und so weiter. Aus der Tabelle1 ist diese erste Gruppe von 4 Breiten, die unter dem L-Code kodiert ist, in Tabelle 2 unter dem L-Code gesucht, und wird mit dem Code der Ziffer 9 übereinstimmen. Folglich wird die erste Ziffer als 9 dekodiert. Auch die anderen Ziffern werden mit Aiuto der Tabelle dekodiert. Zit. Ende, Details sh. Literaturhinweise im pdf, |
|
|
| Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 14.11.2021 ▲ |
|
|
|