
|
Ce code fait partie de la famille des codes à 2 dimensions, il peut encoder jusqu'à 2335 caractères sur une très petite surface. L'encodage se fait en deux étapes : tout d'abord les données sont converties en "mots-clé" de 8 bits (Encodage de haut niveau) puis ceux-ci sont convertis en petits carrés noirs et blancs. (Encodage de bas niveau) De plus un système de correction des erreurs à plusieurs niveaux est inclus, il permet de reconstituer des données mal imprimées, effacées, floues ou arrachées. Dans la suite de cet exposé, l'expression "mot-clé" sera abrégée en MC.
Un code de 2 x 2 régions : 
|
Taille du symbole |
Nombre de |
Nombre de MC de |
Nombre de |
|
Symboles carrés |
|||
|
10x10 |
1 |
5 |
1 |
|
12x12 |
1 |
7 |
1 |
|
14x14 |
1 |
10 |
1 |
|
16x16 |
1 |
12 |
1 |
|
18x18 |
1 |
14 |
1 |
|
20x20 |
1 |
18 |
1 |
|
22x22 |
1 |
20 |
1 |
|
24x24 |
1 |
24 |
1 |
|
26x26 |
1 |
28 |
1 |
|
32x32 |
2x2 |
36 |
1 |
|
36x36 |
2x2 |
42 |
1 |
|
40x40 |
2x2 |
48 |
1 |
|
44x44 |
2x2 |
56 |
1 |
|
48x48 |
2x2 |
68 |
1 |
|
52x52 |
2x2 |
2 x 42 |
2 |
|
64x64 |
4x4 |
2 x 56 |
2 |
|
72x72 |
4x4 |
4 x 36 |
4 |
|
80x80 |
4x4 |
4 x 48 |
4 |
|
88x88 |
4x4 |
4 x 56 |
4 |
|
96x96 |
4x4 |
4 x 68 |
4 |
|
104x104 |
4x4 |
6 x 56 |
6 |
|
120x120 |
6x6 |
6 x 68 |
6 |
|
132x132 |
6x6 |
8 x 62 |
8 |
|
144x144 |
6x6 |
10 x 62 |
8 |
|
Symboles rectangulaires |
|||
|
8x18 |
1 |
7 |
1 |
|
8x32 |
2 |
11 |
1 |
|
12x26 |
1 |
14 |
1 |
|
12x36 |
1x2 |
18 |
1 |
|
16x36 |
1x2 |
24 |
1 |
|
16x48 |
1x2 |
28 |
1 |



|
Mode de compression |
Données à encoder |
Taux de compression |
|
ASCII |
Caractères ASCII 0 à 127 |
1 octet par MC |
|
ASCII étendu |
Caractères ASCII 128 à 255 |
0.5 octet par MC |
|
ASCII numerique |
Chiffres ASCII |
2 octets par MC |
|
C40 |
Majuscules alphanumeriques |
1.5 octet par MC |
|
TEXT |
Minuscules alphanumeriques |
1.5 octet par MC |
|
X12 |
ANSI X12 |
1.5 octet par MC |
|
EDIFACT |
Caractères ASCII 32 à 94 |
1.33 octett par MC |
|
BASE 256 |
Caractères ASCII 0 à 255 |
1 octet par MC |
|
Mot-clés |
Donnée ou fonction |
|
1 à 128 |
Données ASCII |
|
129 |
Remplissage |
|
130 à 229 |
Paire de chiffres : 00 à 99 |
|
230 |
Commute vers le mode C40 |
|
231 |
Commute vers le mode Base 256 |
|
232 |
Ccaractère FNC1 |
|
233 |
Structure de symboles multiples |
|
234 |
Programmation du lecteur |
|
235 |
Passage en ASCII étendu pour un caractère |
|
236 |
Macro |
|
237 |
Macro |
|
238 |
Commute vers le mode ANSI X12 |
|
239 |
Commute vers le mode TEXT |
|
240 |
Commute vers le mode EDIFACT |
|
241 |
Caractère E.C.I. |
|
254 |
Si le mode ASCII est en cours : |
|
L'algorithme "253-state" |
|
Valeur |
Jeu de base pour C40 |
Jeu de base pour TEXT |
Jeu "Shift 1" |
Jeu "Shift 2" |
Jeu "Shift 3" pour C40 |
Jeu "Shift 3" pour TEXT |
Jeu pour X12 |
|
0 |
Shift 1 |
Shift 1 |
NUL (0) |
! (33) |
‘ (96) |
‘ (96) |
CR (13) |
|
1 |
Shift 2 |
Shift 2 |
SOH (1) |
" (34) |
a (97) |
A (65) |
* (42) |
|
2 |
Shift 3 |
Shift 3 |
STX (2) |
# (35) |
b (98) |
B (66) |
> (62) |
|
3 |
Espace (32) |
Espace (32) |
ETX (3) |
$ (36) |
c (99) |
C (67) |
Espace (32) |
|
4 |
0 (48) |
0 (48) |
EOT (4) |
% (37) |
d (100) |
D (68) |
0 (48) |
|
5 |
1 (49) |
1 (49) |
ENQ (5) |
& (38) |
e (101) |
E (69) |
1 (49) |
|
6 |
2 (50) |
2 (50) |
ACK (6) |
' (39) |
f (102) |
F (70) |
2 (50) |
|
7 |
3 (51) |
3 (51) |
BEL (7) |
( (40) |
g (103) |
G (71) |
3 (51) |
|
8 |
4 (52) |
4 (52) |
BS (8) |
) (41) |
h (104) |
H (72) |
4 (52) |
|
9 |
5 (53) |
5 (53) |
HT (9) |
* (42) |
I (105) |
I (73) |
5 (53) |
|
10 |
6 (54) |
6 (54) |
LF (10) |
+ (43) |
j (106) |
J (74) |
6 (54) |
|
11 |
7 (55) |
7 (55) |
VT (11) |
, (44) |
k (107) |
K (75) |
7 (55) |
|
12 |
8 (56) |
8 (56) |
FF (12) |
- (45) |
l (108) |
L (76) |
8 (56) |
|
13 |
9 (57) |
9 (57) |
CR (13) |
. (46) |
m (109) |
M (77) |
9 (57) |
|
14 |
A (65) |
a (97) |
SO (14) |
/ (47) |
n (110) |
N (78) |
A (65) |
|
15 |
B (66) |
b (98) |
SI (15) |
: (58) |
o (111) |
O (79) |
B (66) |
|
16 |
C (67) |
c (99) |
DLE (16) |
; (59) |
p (112) |
P (80) |
C (67) |
|
17 |
D (68) |
d (100) |
DC1 (17) |
< (60) |
q (113) |
Q (81) |
D (68) |
|
18 |
E (69) |
e (101) |
DC2 (18) |
= (61) |
r (114) |
R (82) |
E (69) |
|
19 |
F (70) |
f (102) |
DC3 (19) |
> (62) |
s (115) |
S (83) |
F (70) |
|
20 |
G (71) |
g (103) |
DC4 (20) |
? (63) |
t (116) |
T (84) |
G (71) |
|
21 |
H (72) |
h (104) |
NAK (21) |
@ (64) |
u (117) |
U (85) |
H (72) |
|
22 |
I (73) |
I (105) |
SYN (22) |
[ (91) |
v (118) |
V (86) |
I (73) |
|
23 |
J (74) |
j (106) |
ETB (23) |
\ (92) |
w (119) |
W (87) |
J (74) |
|
24 |
K (75) |
k (107) |
CAN (24) |
] (93) |
x 120) |
X (88) |
K (75) |
|
25 |
L (76) |
l (108) |
EM (25) |
^ (94) |
y (121) |
Y (89) |
L (76) |
|
26 |
M (77) |
m (109) |
SUB (26) |
_ (95) |
z (122) |
Z (90) |
M (77) |
|
27 |
N (78) |
n (110) |
ESC (27) |
FNC1 |
{ (123) |
{ (123) |
N (78) |
|
28 |
O (79) |
o (111) |
FS (28) |
|
| (124) |
| (124) |
O (79) |
|
29 |
P (80) |
p (112) |
GS (29) |
|
}(125) |
}(125) |
P (80) |
|
30 |
Q (81) |
q (113) |
RS (30) |
Upper Shift |
~ (126) |
~ (126) |
Q (81) |
|
31 |
R (82) |
r (114) |
US (31) |
|
DEL (127) |
DEL (127) |
R (82) |
|
32 |
S (83) |
s (115) |
|
|
|
|
S (83) |
|
33 |
T (84) |
t (116) |
|
|
|
|
T (84) |
|
34 |
U (85) |
u (117) |
|
|
|
|
U (85) |
|
35 |
V (86) |
v (118) |
|
|
|
|
V (86) |
|
36 |
W (87) |
w (119) |
|
|
|
|
W (87) |
|
37 |
X (88) |
x 120) |
|
|
|
|
X (88) |
|
38 |
Y (89) |
y (121) |
|
|
|
|
Y (89) |
|
39 |
Z (90) |
z (122) |
|
|
|
|
Z (90) |
|
Exemple, séquence à encoder en mode C40 : Ab Les 3 caractères sont : 14, 02, 02 |
Les caractères étendus sont encodés comme suit :
|
Exemple en C40: |
|
Valeur EDIFACT |
Valeur ASCII du caractère |
Commentaire |
|
0 à 30 |
64 à 94 |
Valeur EDIFACT = valeur ASCII - 64 |
|
31 |
|
Fin des données, retour au mode ASCII |
|
32 à 63 |
32 à 63 |
Valeur EDIFACT = valeur ASCII |
|
Exemple, séquence à encoder en mode EDIFACT : ABC! Les valeurs des 4 caractères EDIFACT sont : 1, 2, 3, 33 |
|
L'algorithme "255-state". |
For i = 0 To m - 1
t = (d(i) Xor c(k - 1))
For j = k - 1 To 0 Step -1
If t = 0 Then
c(j) = 0
Else
c(j) = Mult(t, a(j))
End If
If j > 0 Then c(j) = c(j - 1) Xor c(j)
Next
Next
|
Opérations arithmétiques dans un champ
de Galois de caractéristique 2.
Maintenant nous pouvons calculer Mult = Alog((Log(a) + Log(b)) Mod 255) |
Maintenant que nous savons créer le motif d'un code barre, il nous reste à le dessiner à l'écran et à l'imprimer sur papier. Deux approches sont possibles :
Il semble qu'il n'y ait pas de police gratuite pour codes barre Datamatrix
sur le net. J'ai donc décidé de dessiner entièrement cette police et de la proposer en téléchargement. Puisque
chaque symbole a un nombre pair de lignes et un nombre pair de colonnes, je
met dans chaque caractère de la police 4 modules (2 lignes et 2 colonnes). De
cette manière nous avons 16 combinaisons assignées aux 16 premières lettres
majuscules.
Si nous donnons une valeur à chaque point de cette matrice de
2 X 2 comme ceci :
|
1 |
2 |
|
4 |
8 |
Cette police contient les 16 caractères A (ASCII : 65) à P (ASCII : 80)
|
Copiez ce fichier |
Le programme devra se dérouler en 4 étapes :
Du fait de l'interaction entre les différents modes de compression il est difficile de faire une optimisation à 100%. Le programme va donc décomposer la chaine en "blocs" de type "numérique", "texte" ou "octet" puis il repassera certains blocs dans un autre mode si la surcharge dûe aux MC de commutation est supérieure au gain de compression. On ne pourra pas tenir compte de tous les paramètres tels les rembourrages ...

|
Vous aimez cette page ? Cliquez ici ! |