Suma kontrolna - liczenie

dział ogólny

Suma kontrolna - liczenie

Nowy postprzez Corvis » Å›roda, 18 marca 2009, 23:58

Witam,

Mam trochÄ™ tandetne pytanie - ale jakoÅ› mi to nie wychodzi.

Mam sobiÄ™ jakaÅ› ramkÄ™ danych np.

U 103 | suma kontrola

gdzie U - jeden bajt , spacja , 3 bajty
suma kontrola jest sumą wszystkich tych bajtów

Pytanie brzmi jak to dodać do siebie :\

U - jest to 85 Dec lub 55 Hex
spacja - jest to 32 Dec lub 20 Hex

itd

jak dodać te bajty do siebie w Builderze i otrzymać sumę kontrolną
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
PodziÄ™kowaÅ‚ : 80
OtrzymaÅ‚ podziÄ™kowaÅ„: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    NieznanyNieznana

Re: Suma kontrolna - liczenie

Nowy postprzez kinio » czwartek, 19 marca 2009, 10:26

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
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Suma kontrolna - liczenie

Nowy postprzez Corvis » czwartek, 19 marca 2009, 23:13

Dane odbierałem do tablic unsigned char[rozmiar] ;

Już wszystko policzyłem i działa -> dzięki za sugestię daje kod jak by ktoś sie kiedyś zastanawiał :

Kod: Zaznacz cały
char *wskNaBuffor;
unsigned char RxVal[38];
unsigned char sumaKontrolaRamka = RxVal[37];
unsigned char sum;
wskNaBuffor=RxVal;
ileDanych=38;  // bez sumy
while(--ileDanych) {
   sum+=*wskNaBuffor++;
}
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
PodziÄ™kowaÅ‚ : 80
OtrzymaÅ‚ podziÄ™kowaÅ„: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    NieznanyNieznana

Re: Suma kontrolna - liczenie

Nowy postprzez Corvis » czwartek, 19 marca 2009, 23:49

nie no znalazłem ciekawą rzecz może mi to ktoś wyjaśnić

ten kod co wkleiłem liczy źle ale jeżeli zrobię taki myk :

dodam przed pętlą while

Kod: Zaznacz cały
char znak=*wskNaBuffor;


liczy dobrze - nie kumam tego ;\
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
PodziÄ™kowaÅ‚ : 80
OtrzymaÅ‚ podziÄ™kowaÅ„: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    NieznanyNieznana

Re: Suma kontrolna - liczenie

Nowy postprzez Witold » piÄ…tek, 20 marca 2009, 00:20

Corvis napisał(a):nie no znalazłem ciekawą rzecz może mi to ktoś wyjaśnić

ten kod co wkleiłem liczy źle ale jeżeli zrobię taki myk :

dodam przed pętlą while

Kod: Zaznacz cały
char znak=*wskNaBuffor;


liczy dobrze - nie kumam tego ;\


W wcześniejszym kodzie nie ma zmiennej znak. Dziwne.

Tak przy okazji chyba pomieszałeś typy char i unsigned char w: wskNaBuffor=RxVal;
Zmienne mają losowe wartości?, sum nie pomieści sumy ?
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Suma kontrolna - liczenie

Nowy postprzez Corvis » piÄ…tek, 20 marca 2009, 00:40

o SZITTTTTTTT właśnie tu był błąd !!! wkaźnik był typu char a dane unsigned char zmieniłem typ i wszystko śmiga !!! dzięki kolego !!!
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
PodziÄ™kowaÅ‚ : 80
OtrzymaÅ‚ podziÄ™kowaÅ„: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości