Announcement

Collapse
No announcement yet.

Prüfziffernberechnung für Barcodes

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Prüfziffernberechnung für Barcodes

    Ich habe zwei Barcodetypen: CODABAR und Code39.<BR>
    Ich weiß, daß man die Prüfziffer bei CODABAR nach Modulo16 und bei Code39 nach Modulo43 berechnet.

    Ich habe hier auch jeweils ein Beispiel zur Erklärung:<BR>
    <B>CODABAR</B><BR>
    Code : A 7 8 9 A<BR>
    Referenzzahlen* : 16 7 8 9 16<BR>
    Summe der Ref.Zahlen : 56<BR>
    Modulo 16 : 56 / 16 = 3 Rest 8<BR>
    Differenz : 16 - 8 = 8<BR>
    Prüfziffer Referenzzahl 8 = "8"<BR>

    *Referenzzahlen für Codabar:<BR>
    00 = 0<BR>
    01 = 1<BR>
    02 = 2<BR>
    03 = 3<BR>
    04 = 4<BR>
    05 = 5<BR>
    06 = 6<BR>
    07 = 7<BR>
    08 = 8<BR>
    09 = 9<BR>
    10 = -<BR>
    11 = $<BR>
    12 = :<BR>
    13 = /<BR>
    14 = .<BR>
    15 = +<BR>
    16 = A<BR>
    17 = B<BR>
    18 = C<BR>
    19 = D<BR>

    <B>Code39</B><BR>
    Code ("159AZ") 1 5 9 A Z<BR>
    Referenzzahlen* 1 +5 +9 +10 +35 = 60 (Summe)<BR>
    60 / 43 = 1 rest 17<BR>
    Die Prüfziffer ist "H" (Referenznr. 17)<BR>

    *Die Referenzzahlen des Code 39 sind wie folgt:<BR>
    00 0<BR>
    01 1<BR>
    02 2<BR>
    03 3<BR>
    04 4<BR>
    05 5<BR>
    06 6<BR>
    07 7<BR>
    08 8<BR>
    09 9<BR>
    10 A<BR>
    11 B<BR>
    12 C<BR>
    13 D<BR>
    14 E<BR>
    15 F<BR>
    16 G<BR>
    17 H<BR>
    18 I<BR>
    19 J<BR>
    20 K<BR>
    21 L<BR>
    22 M<BR>
    23 N<BR>
    24 O<BR>
    25 P<BR>
    26 Q<BR>
    27 R<BR>
    28 S<BR>
    29 T<BR>
    30 U<BR>
    31 V<BR>
    32 W<BR>
    33 X<BR>
    34 Y<BR>
    35 Z<BR>
    36 -<BR>
    37 .<BR>
    38 Space<BR>
    39 $<BR>
    40 /<BR>
    41 +<BR>
    42 %<BR>

    Aber wie setzte ich das in jeweils eine schöne Delphi- Funktion um?
    Bitte bitte helft mir!

  • #2
    Du brauchst nur passende Konstantenfelder
    definieren.
    <PRE>

    const
    bar19_to_char : array[0..19] of char =
    ('0','1',...'C','D');
    bar19_to_code : array['$'..'D'] of byte =
    (11, { $ }
    20, { % ungültiger Wert }
    ... { die ASCII-Tabelle bis 'D' }
    18, { C }
    19 { D }
    );

    function pruef19(s:string):char;
    var i,j : integer;
    begin
    j:=0;
    for i:=1 to length(s) do
    j:=j+bar19_to_code[copy(s,i,1)];
    j:= j div ... { Prüfzifferrechnung }
    result:=bar19_to_char[j];
    end;

    </PRE>
    ich hoffe es hilf

    Comment


    • #3
      Ganz herzlichen Dank, für die schnelle Reaktion, aber hilfe !!!, ich versteh nur Bahnhof (naja, Anfänger halt), aber ich krieg's auch nicht nachgebastelt<BR>
      sorry, aber ich weiß nicht, wie ich das vervollständigen soll:<BR>
      <PRE>bar19_to_code : array['$'..'D'] of byte =
      (11, { $ }
      20, { % ungültiger Wert }
      ... { die ASCII-Tabelle bis 'D' }
      18, { C }
      19 { D }
      );</PRE>

      und diese Zeile:
      <PRE>j:=j+bar19_to_code[copy(s,i,1)]; </PRE>
      bringt den Fehler: "Inkompatible Typen: 'Char' und 'String'"

      Ich seh auch keinen Zusammenhang zwischen den Referenzzahlen der Barcodes und der ASCII-Tabelle. Kann man mir das bitte bitte nochmal erklären oder bisschen vereinfachen?
      Danke schon mal, Be

      Comment


      • #4
        Die zweite Definition ist auch so möglich
        <PRE>
        bar19_to_code : array[36..68] of byte = (11,...,19);
        </PRE>
        mit dem Zugriff
        j := j + bar19_to_code[ord(ch)];

        das kann aber auch mit Charakteren geschrieben werden
        <PRE>
        bar19_to_code : array['$'..'D'] of byte =
        (11, { $ entspricht ASCII 36 }
        20, { % }
        20, { & }
        20, { ' }
        20, { ( }
        20, { ) }
        20, { * }
        15, { + }
        20, { , }
        10, { - }
        14, { . }
        13, { / }
        0, { 0 }
        1, { 1 }
        2, { 2 }
        3, { 3 }
        4, { 4 }
        5, { 5 }
        6, { 6 }
        7, { 7 }
        8, { 8 }
        9, { 9 }
        12, { : }
        20, { ; }
        20, { < }
        20, { = }
        20, { > }
        20, { ? }
        20, { @ }
        16, { A }
        17, { B }
        18, { C }
        19 { D entspricht ASCII 68 }
        );
        </PRE>
        mit dem Zugriff
        j := j + bar19_to_code[ch];

        mit kurzen Strings wird der Fehler vermieden
        <PRE>
        type
        s40 = string[40];

        function pruef19(s:s40):char;
        .
        .
        j := j + bar19_to_code[s[i]];

        </PRE&gt

        Comment


        • #5
          Danke für die Hilfe, ich glaube, jetzt versteh ich es etwas, ich hab das für den Code39 jetzt so gemacht:
          <PRE>
          type
          s60 = string[60];
          const
          bar43_to_char : array[0..42] of char = ('0','1','2','3','4','5','6','7','8','9',
          'A','B','C','D','E','F','G','H','I','J','K','L','M ','N','O','P','Q','R','S','T','U','V','W','X','Y', 'Z',
          '-','.',' ','$','/','+','%');
          bar43_to_code : array['$'..'Z'] of byte =
          (39, { $ }
          42, { % }
          43, { & }
          43, { ' }
          43, { ( }
          43, { ) }
          43, { * }
          41, { + }
          43, { , }
          36, { - }
          37, { . }
          40, { / }
          0, { 0 }
          1, { 1 }
          2, { 2 }
          3, { 3 }
          4, { 4 }
          5, { 5 }
          6, { 6 }
          7, { 7 }
          8, { 8 }
          9, { 9 }
          43, { : }
          43, { ; }
          43, { < }
          43, { = }
          43, { > }
          43, { ? }
          43, { @ }
          10, { A }
          11, { B }
          12, { C }
          13, { D }
          14, { E }
          15, { F }
          16, { G }
          17, { H }
          18, { I }
          19, { J }
          20, { K }
          21, { L }
          22, { M }
          23, { N }
          24, { O }
          25, { P }
          26, { Q }
          27, { R }
          28, { S }
          29, { T }
          30, { U }
          31, { V }
          32, { W }
          33, { X }
          34, { Y }
          35 { Z }
          );
          function modula43(s:s60):char;
          var i,j : integer;
          begin
          j:=0;
          for i:=1 to length(s) do
          j := j + bar43_to_code[s[i]];
          j:= (j - trunc(j / 43) * 43);
          result := bar43_to_char[j];
          end;<BR>

          // Aufrufmöglichkeit z.B.
          // in Edit1 steht 159AZH , H soll hier die Prüfziffer sein<BR>

          procedure TForm1.Button1Click(Sender: TObject);
          var pruef:string;
          begin
          pruef:=copy(Edit1.Text,Length(Edit1.Text),1);
          if pruef=modula43(copy(edit1.Text,1,Length(Edit1.Text )-1))Then
          Label1.Caption:=modula43(copy(edit1.Text,1,Length( Edit1.Text)-1))
          else Label1.Caption:='Prüfziffer nicht vorhanden oder falsch';
          end;
          </PRE>

          Das müßte doch jetzt so richtig sein, oder?
          Ich bedank mich nochmals für die Hilfe

          Comment

          Working...
          X