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
unsigned char cs = 0xf5; unsigned char buffer[3]; buffer[0] = cs & 0xf0; buffer[1] = cs & 0x0f; etwa so?
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.
> 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];
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
Nein, Walter hat nicht richtig gelesen.. Richtig wäre
1 | char digits[16] = "0123456789ABCDEF"; |
2 | string[5] = digits[(unsigned char)checksumme >> 4]; |
3 | string[6] = ditigs[checksumme & 0x0F]; |
4 | string[7] = 0x0D |
Sodass 0x0D (ASCII 13) am Ende des Arrays "string" steht.
Nein, wenn dann String[6] = 0x0D; digit mit dem Index 13 gibt an String[6] das 'E' zurück.
Danke. Das leuchtet mir auch ein! Jetzt funktioniert es auch richtig. Aber Vorsicht 2. Mal (in 3. Zeile) ist digits falsch geschrieben! Vielen Dank euch Matze
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.