NMEA Checksum

Gast #367799
Lesenswert?

Hallo.
Ich habe eine Checksumme berechnet, das Ergebnis muss aber aus 2
Characters bestehen. Dass heißt, ich will jedes Hexnibbel im Bereich
0...9 A...F aus meinem Ergebnis haben, damit ich es in einem Array in 2
Feldern speichern kann.

Im Prinzip:

char checksumme = 'F5';

char string[7]

string[5] = 'F'
string[6] = '5'

Wie bewerkstellige ich das am Besten?

Ich habe mir schon Gedanken gemacht, die Checksumme bitweise mit 0000
1111 bzw 1111 0000 zu verunden, um so jewils ein Nibbel auszublenden.
Das Ganze scheint mir jedoch sehr umständlich zu sein.

Hab noch eine Idee:

Geht das so:?

string[5] = (checksumme > 4);  //High nibble
string[6] = (checksumme < 4);  //Low nibble

Gruß Matthias
Gast #367801
Lesenswert?

Genau so hatte ich das gedacht, habe ich aber dann nicht das Problem,
dass ich dann in Buffer[0] das erste Nibble plus die 0 vom 2. Nibble
stehen habe? Das will ich nämlich nicht. Im Buffer[0] soll nur das
erste Nibble stehen zB F.
Gast #367802
Lesenswert?

> char checksumme = 'F5';

Meintest du nicht eher:

  char checksumme = 0xF5;

Wobei dieser Wert in einen char vermutlich nicht reinpasst, da dieser
Typ bei gcc in der Regel vorzeichenbehaftet ist und damit nur bis 0x7f
geht.

> Geht das so:?
>
> string[5] = (checksumme > 4);  //High nibble
> string[6] = (checksumme < 4);  //Low nibble

Da die Variable "string" heißt, nehme ich an, daß du Zeichen haben
willst. Dann geht das so nicht (aber sonst wäre es auch nicht
gegangen). Mal angenommen, du meintest nicht > und <, sondern >> und
<<: In string[5] steht nachher bei obigigem checksumme eine 16 (0xF)
drin und nicht das Zeichen 'F'. In string[6] steht 80 drin (0x50).

Etwa so könntest du es machen:

char digits[16] = "0123456789ABCDEF";
string[5] = digits[(unsigned char)checksumme >> 4];
string[6] = ditigs[checksumme & 0x0F];
Gast #367803
Lesenswert?

Klasse, so funktionierts.

Als Stringendzeichen will ich ein Carriage Return setzten,
(im ASCII Code 0x0D oder Dezimal 13). Wie bekomme ich das in ein Array
Feld hinein?

Und vielen Dank nochmal

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren