Wpisany przez Tomasz Lubiński,
11 sierpnia 2007 11:55
Kod kreskowy MSI został opracowany przez MSI Data Corporation, na podstawie kodu Plessey. Kod kreskowy MSI zwany również zmodyfikowanym kodem Plessey używany jest głównie do oznaczania półek, na których znajduje się asortyment. Kod ten pozwala zapisać dowolną liczbę cyfr w systemie szesnastkowym 0-F, albo dziesiętnym 0-9, przy czym częściej używana jest wersja do zapisu w systemie dziesiętnym. MSI koduje znaki za pomącą dwóch rodzajów kresek - cienkich oraz grubych. Przy czym kreska gruba jest dwukrotnie grubsza od kreski cienkiej. Odstęp pomiędzy kreskami zależy od tego jaka kreska była kodowana przed nim, jeżeli cienka to odstęp ma szerokość kreski grubej, jeżeli gruba to odstęp ma szerokość kreski cienkiej. Kolejne cyfry kodowane są zgodnie z tabelą poniżej, jak łatwo zauważyć kod odpowiada binarnej reprezentacji kodowanej cyfry:
Kod kreskowy MSI używa jednej bądź dwóch cyfr do zapisu sumy kontorlnej. Może być ona obliczana na kilka różnych sposobó i to od aplikacji zależy, który z nich zostanie wybrany.
Zakodujmy kodem kreskowym MSI liczbę 426.
Na początku znak start, kodowany jako: 110.
Następnie cyfra "4", kodowana jako: 100110100100.
Kolejna cyfra to "2", kodowana jako: 100100110100.
Ostat cyfra to "6", kodujemy ją zgodnie z tabelką jako: 100110110100.
Teraz suma kontrolna (w przykładzie użyjemy modulo 10) "5", kodowana jako: 100110100110.
Całość zamyka znak stop, kodowany jako: 1001.
Całość daje nam: 1101001101001001001001101001001101101001001101001101001, co zapisane w formie graficznej możemy przedstawić następująco:
kodowana cyfra | kod 0 - pasek cieńki 1 - pasek gruby | kod kreskowy |
0 | 0000 | 100100100100 |
1 | 0001 | 100100100110 |
2 | 0010 | 100100110100 |
3 | 0011 | 100100110110 |
4 | 0100 | 100110100100 |
5 | 0101 | 100110100110 |
6 | 0110 | 100110110100 |
7 | 0111 | 100110110110 |
8 | 1000 | 110100100100 |
9 | 1001 | 110100100110 |
A | 1010 | 110100110100 |
B | 1011 | 110100110110 |
C | 1100 | 110110100100 |
D | 1101 | 110110100110 |
E | 1110 | 110110110100 |
F | 1111 | 110110110110 |
Start | - | 110 |
Stop | - | 1001 |
- Kod MSI ma następującą strukturę:
- znak start,
- dowolna liczba cyfr,
- suma kontrolna,
- znak stop
Kod kreskowy MSI używa jednej bądź dwóch cyfr do zapisu sumy kontorlnej. Może być ona obliczana na kilka różnych sposobó i to od aplikacji zależy, który z nich zostanie wybrany.
- Suma kontrolna modulo 10:
By obliczyć sumę kontrolną modulo 10 należy:
- z kodowanej liczby wyrzucić wszystkie cyfry nieparzyste,
- wynik z poprzedniego kroku należy pomnożyć przez 2,
- dodać do siebie wszystkie cyfry uzyskane w poprzednim kroku oraz wszystkie cyfry nieparzyste z kodowanej liczby,
- wynik z poprzedniego kroku podzielić modulo 10,
- wynik z poprzedniego kroku odjąć od 10 i znów podzielić modulo 10.
Przeanalizujmy ten algorytm dla liczby 653081. Po wyrzuceniu wszystkich cyfr nieparzystych otrzymamy 608. Wynik z poprzedniego kroku należy pomnożyć przez 2. Zatem w naszym przypadku 608 * 2 = 1216. Teraz dodajemy do siebie wszystkie cyfry uzyskane w poprzednim kroku oraz wszystkie cyfry nieparzyste z kodowanej liczby. Czyli otrzymujemy 1 + 2 + 1 + 6 + 5 + 3 + 1 = 19. Teraz wynik dzielimy modulo 10. W naszym przykładzie 10 mod 19 = 9. I ten wynik odejmujemy od 10 i dzielimy modulo 10, otzymując końcowy wynik. Zatem w naszym przykładzie 10 - 9 = 1, 1 mod 10 = 1, czyli cyfrą kontrolną jest 1.
Innym sposobem może być użycie następującej tablicy wartości kolejnych znaków: {0, 1, 4, 3, 8, 5, 3, 7, 7, 9, 2, 11, 6, 13, 10, 15} (indeksy w tej tablicy zaczynają się od 0). Wówczas należy dodać do siebie wartości wszystkich cyfr składających się na kod, następnie podzielić ten wynik modulo 10, następnie odjąć ten wynik od 10 i znów podzielić według tej tablicy ten wynik modulo 10.
Rozpatrzmy zatem jeszcze raz kod: 653081, odczytamy z tablicy wartości kolejnych cyfr i dodamy je do siebie: 3 + 5 + 3 + 0 + 7 + 1 = 19, teraz podzielimy ten wynik modulo 10, 19 mod 10 = 9, wynik ten odejmujemy od 10 i dzielimy znów modulo 10, 10 - 9 = 1, 1 mod 10 = 1, czyli zgodnie z oczekiwaniami wynik jest taki sam jak poprzednio czyli cyfrą kontrolną jest 1, zatem prawidłowy kod wygląda: 6530811 - suma kontrolna 2 modulo 10:
W tym wypadku obliczane są dwie sumy kontrolne modulo 10, zgodnie z algorytmem opisanym w punkcie powyżej. Pierwsz suma kontrolna obliczana jest dla wejściowego kodu, a następnie dołączana do niego. Druga suma kontrolna obliczna jest do wyniku poprzedniego kroku i znów dołączana do niego. Czyli dla kodu 653081 z poprzedniego punktu otrzymamy, po pierwszym kroku 6530811, a następnie obliczając znów sumę kontrolną modulo 10 dla kodu 6530811, otrzymamy końcowy wynik: 65308110 - suma kontrolna modulo 11:
By obliczyć sumę kontrolną modulo 11 należy:
- obliczyć sumę ważoną wszystkich cyfr - waga cyfry położonej najbardziej po prawej stronie wynosi 2, drugiej od prawej 3, kolejnej od prawej 4, ... aż do szóstej cyfry od prawej, której waga wynosi 7, kolejna siódma cyfra od prawej strony ma znów wagę 2, ósma wagę 3, i tak dalej.
- wynik z poprzedniego kroku dzielimy modulo 11,
- wynik ten odejmujemy od 11 i znów dzielimy modulo 11.
Przenalizujmy ten algorytm dla liczby 24653081. Najpierw obliczymy sumę ważoną 2*3 + 4*2 + 6*7 + 5*6 + 3*5 + 0*4 + 8*3 + 1*2 = 6 + 8 + 42 + 30 + 15 + 0 + 24 + 2 = 127. Wynik ten dzielimy modulo 11, 127 mod 11 = 6. Ten wynik odejmujemy od 11 i znów dzielimy modulo 11. 11 - 6 = 5, 5 mod 11 = 5. Zatem cyfrą kontrolną jest 5. Otrzymamy zatem wynik: 246530815.
Należy tutaj zwrócić uwagę, że suma kontrolna modulo 11 może wyjść w skrajnym przypadku 10, wówczas należy użyć symbolu A, co wskazuje, że ta suma kontrolna powinna być używana wyłącznie do sprawdzania zapisu szesnastkowego. - suma kontrolna modulo 11/modulo 10:
W tym wypadku obliczane są dwie sumy kontrolne. Najpierw obliczana jest suma kontrolna modulo 11, zgodnie z algorytmem opisanym w punkcie powyżej. Suma kontrolna modulo 11 obliczana jest dla wejściowego kodu, a następnie dołączana do niego. Następnie obliczana jest druga suma kontrolna modulo 10. Wyliczana jest on dla wyniku poprzedniego kroku i znów dołączana do niego. Czyli dla kodu 653081 otrzymamy, po pierwszym kroku 6530818 (6*7 + 5*6 + 3*5 + 0*4 + 8*3 + 1*2 = 42 + 30 + 15 + 0 + 24 + 2 = 113, 113 mod 11 = 3, 11 - 3 mod 11 = 8), a następnie obliczając sumę kontrolną modulo 10 dla kodu 6530818, otrzymamy końcowy wynik: 65308184
Przykład:
Zakodujmy kodem kreskowym MSI liczbę 426.
Na początku znak start, kodowany jako: 110.
Następnie cyfra "4", kodowana jako: 100110100100.
Kolejna cyfra to "2", kodowana jako: 100100110100.
Ostat cyfra to "6", kodujemy ją zgodnie z tabelką jako: 100110110100.
Teraz suma kontrolna (w przykładzie użyjemy modulo 10) "5", kodowana jako: 100110100110.
Całość zamyka znak stop, kodowany jako: 1001.
Całość daje nam: 1101001101001001001001101001001101101001001101001101001, co zapisane w formie graficznej możemy przedstawić następująco:
Implementacje
Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
Tomasz Lubiński | C# | Microsoft Visual Studio 2010 | .cs | .cs | ***** / 0 |
Tomasz Lubiński | C/C++ | Borland Builder 6 | .cpp | .cpp | ***** / 1 |
Tomasz Lubiński | Delphi/Pascal | Borland Delphi 5 | .pas | .pas | ***** / 2 |
Tomasz Lubiński | Java | .java | .java | ***** / 2 |
Poprawiony: 29 sierpnia 2012 18:42