Hej,
A powiedz jak przechwoujesz takÄ… ramkÄ™:
- Czy jest to zwykły String, taki który może być przechowywany jako zmienna AnsiString, lub char*
- Czy jest to np. tablica typu int itp.
Jeżeli jest to string to trzeba dodać tylko kody ASCII tych znaków.
Do pojedynczego znaku możesz się odnieść np tak:
- Kod: Zaznacz cały
AnsiString ramka = "U 103 | suma kontrola";
char pierwszy_znak = ramka[1];
tak, operator [] jest tak przeciążony że pierwszy znak ma index 1a nie 0!!!
Tak więc aby sprawdzić wszystkie znaki to trzeba użyć takiej pętli:
- Kod: Zaznacz cały
for(int i=1;i<=ramka.Length();++i)
ramka[i];
Typ char jest typem znakowym, ale tak naprawdÄ™ to przechowuje on kod ASCII danego znaku.
Może on być łatwo i bezboleśnie zamieniony na typ liczbowy np.:
- Kod: Zaznacz cały
int kod_znaku = (int)pierwszy_znak;
Teraz możesz je sumować jak zwykłe liczby.
Rozumiem że ta ramka to jest Twój twór i znasz na 100% jej strukturę?!
Jednak uważaj na typ tej sumy kontrolnej.
Możesz napisać tak:
- Kod: Zaznacz cały
char suma = 'a' + 'O';
jest to działanie oczywiście dozwolone, poprawne które dodaje kody ASCII.
Jednak jeżeli wynik zapiszesz do zmiennej typu
char, wynik może okazać się niepoprawny, ponieważ ten typ ma rozmiar tylko
jednego bajta.
Czyli największą wartością jaką może przechowywać jest
255.
Więc jeżeli dodasz kody kolejnych znaków, które w sumie przekroczą 255 to to co jest ponad zostaje obcięte dokładnie tak jakbyś napisał:
- Kod: Zaznacz cały
int suma = ('a' + 'O') % 256;
Być może nie wychodzi ponieważ zastosowałeś zły typ do którego zapisujesz sumę?!
Jeżeli jednak wszystko jest ok, to podaj więcej szczegółów, lub może kod który nie działa!
Pozdrawiam!
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing