[PHP] berekenen checksum digit

Pagina: 1
Acties:

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 27-08 19:31
Ik heb een string: TEST93
Hiervoor moet een checksum digit worden uitgerekend. Dit gaat als volgt:
Elk karakter heeft een waarde die opgezocht kan worden in een array:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
$EncTable = array
    (
        /* 0  */ "0",
        /* 1  */ "1",
        /* 2  */ "2",
        /* 3  */ "3",
        /* 4  */ "4",
        /* 5  */ "5",
        /* 6  */ "6",
        /* 7  */ "7",
        /* 8  */ "8",
        /* 9  */ "9",
        /* A  */ "10",
        /* B  */ "11",
        /* C  */ "12",
        /* D  */ "13",
        /* E  */ "14",
        /* F  */ "15",
        /* G  */ "16",
        /* H  */ "17",
        /* I  */ "18",
        /* J  */ "19",
        /* K  */ "20",
        /* L  */ "21",
        /* M  */ "22",
        /* N  */ "23",
        /* O  */ "24",
        /* P  */ "25",
        /* Q  */ "26",
        /* R  */ "27",
        /* S  */ "28",
        /* T  */ "29",
        /* U  */ "30",
        /* V  */ "31",
        /* W  */ "32",
        /* X  */ "33",
        /* Y  */ "34",
        /* Z  */ "35",
        /* -  */ "36",
        /* .  */ "37",
        /* SP */ "38",
        /* $  */ "39",
        /* /  */ "40",
        /* +  */ "41",
        /* %  */ "42",
        /* ($)*/ "43",
        /* (%)*/ "44",
        /* (/)*/ "45",
        /* (+)*/ "46",
        /* *SS*/ "47"
    );


Elk karakter van de string krijgt dan een vermenigvuldigingsfactor. Deze begint bij het meest rechtse karakter bij 1 en loopt dan op tot 20. Vervolgens begint het weer bij 1.
Het karaktergetal wordt dan karakterwaarde x vermenigvuldigingsfactor. Dus:

code:
1
2
3
4
5
6
7
karakter:                 T | E | S | T | 9 | 3
----------------------------|---|---|---|---|---
karakterwaarde:           29| 14| 28| 29| 9 | 3
----------------------------|---|---|---|---|---
vermenigvuldigingsfactor: 6 | 5 | 4 | 3 | 2 | 1
----------------------------|---|---|---|---|---
karaktergetal:           174| 70|112| 87| 18| 3


Nu tel je alle karaktergetallen bij elkaar op: 174+70+112+87+18+3 = 464

Nu doe je 464 modules 47. De rest is het checksum digit

Nu moet dit geheel vertaald worden naar een PHP functie.
Dus string erin, checksum digit eruit.
Hetgene waar ik het meeste problemen mee heb is het koppelen van een vermenigvuldigingsfactor aan een letter.
Deze mag maximaal 20 zijn en moet dan weer bij 1 beginnen. Geen flauw idee ;)
code:
1
2
v  e  r  m  e  n  i  g  v  u  l  d  i  g  i  n  g  s  f  a  c  t  o  r
04 03 02 01 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01


Kan iemand mijn dosis inspiratie aanvullen?

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 30-08 17:07
Controleren met een if-statement.
code:
1
2
3
4
if (factor > 20)
  factor = 0
else
  // gewoon doorgaan

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 27-08 19:31
Nee dat bedoel ik dus niet.
Hoe assign ik die vermenigvuldigingsfactor aan die karakters.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Hoezo?? Dat loopt toch gewoon??? Je kunt toch teken voor teken bij langs gaan?? Dan hoef je alleen de sommatie tot nu toe en een tellertje voor de vermenigvuldigings factor bij te houden... Aan het eind doe je de totale sommatie mod 47 en klaar is klara... Wil je perse dat die factor afloopt en op 1 eindigd? Draai je de string gewoon om en tel je weer vanaf het begin.. Zo moeilijk is het toch niet?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Nou, je weet toch hoe lang die string is?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 11:21
Ik zie trouwens niet in hoe je checksum er sterker op wordt, dat je de vermenigvuldigingsfactor van achteren naar voren laat oplopen in plaats van andersom?

Kun je sowieso niet een standaard CRC berekenen en die modulo 47 nemen? (Of beter nog: een CRC waarde berekenen die op maximaal 46 uitkomt, maar dat is lastiger.)

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 27-08 19:31
Tnx.. Deze checksum is het eerste deel van de checksum die wordt gebruikt om een CODE93 barcode te genereren. Met deze checksum en de originele string genereer je de 2e checksum. De string en de 2 checksums vormen tezamen de barcode.
Kortom... Ik ben bezig een class te maken om een CODE93 barcode te genereren. ;)

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 13-01 07:19
Stringlength mod 20 en je weet wat de eerste vermenigvuldigingsfactor is. Dan zou het geen probleem meer moeten zijn.
Pagina: 1