algorytm.org

MSI



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

MSI
Ocena użytkowników:***** / 1
SłabyŚwietny 
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:

kodowana
cyfra
kod
0 - pasek cieńki
1 - pasek gruby
kod
kreskowy
00000100100100100
10001100100100110
20010100100110100
30011100100110110
40100100110100100
50101100110100110
60110100110110100
70111100110110110
81000110100100100
91001110100100110
A1010110100110100
B1011110100110110
C1100110110100100
D1101110110100110
E1110110110110100
F1111110110110110
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:
MSI

Implementacje
AutorJęzyk
programowania
KomentarzOtwórzPobierzOcena
Tomasz LubińskiC#Microsoft Visual Studio 2010
.cs
.cs
***** / 0
Tomasz LubińskiC/C++Borland Builder 6
.cpp
.cpp
***** / 1
Tomasz LubińskiDelphi/PascalBorland Delphi 5
.pas
.pas
***** / 2
Tomasz LubińskiJava
.java
.java
***** / 2
 
Dodaj własną implementację tego algorytmu
  • Zaloguj się na stronie
Plik:
Język
programowania:
Komentarz:
  By móc dodać implementacje zaloguj się na stronie

Poprawiony: 29 sierpnia 2012 18:42
Dodaj komentarz