Hallo, ich möchte gerne aus einem empfangenen String zwei Zeichen mit den darauf folgenden zwei Zeichen vergleichen (in C). Also so: 1. String: "A0" = 1010 0000 2. String: "20" = 0010 0000 Der zweite String beinhaltet keine neu 1, die String 1 nicht hat. Wenn allerdings: 1. String: "A0" = 1010 0000 2. String: "21" = 0010 0001 möchte ich mit dem Erhöhen eines Counters reagieren. Meine Frage wäre, wie kann ich bspw. "A0" in binär umwandeln und mit dem darauffolgenden Teilstring vergleichen? VG
Günther schrieb: > Meine Frage wäre, wie kann ich bspw. "A0" in binär umwandeln und mit dem > darauffolgenden Teilstring vergleichen? Es liegt immer binär vor, C hat ja keinen String Datentyp. Vermutlich hast du beide Strings als unsigned char[] vorliegen. Mit diesen kannst du genau so rechnen wie mit allen anderen Datentypen ( also auch XOR ). Du willst also rausfinden, welche Bits in String 2 gesetzt sind, die in String 1 nicht gesetzt sind ? Dazu gibt es natürlich mehrere Lösungen, der naive Ansatz wäre wohl:
1 | unsigned char str1[2] = { 'A', '0' }; |
2 | unsigned char str2[2] = { '2', '1' }; |
3 | unsigned char result[2]; |
4 | |
5 | int i, j; |
6 | |
7 | for(i=0; i<2; i++) // i<2, da es 2 Buchstaben sind |
8 | {
|
9 | for(j=0; j<8; j++) |
10 | {
|
11 | if( !(str1[i] & (1<<j) && (str2[i] & (1<<j) ) |
12 | {
|
13 | result[i] |= (1<<j); |
14 | }
|
15 | }
|
16 | }
|
Es ist sowieso immer alles binär. Wandeln braucht man da gar nichts. Vermutlich soll "A0" kein String sein, sondern die Hex-Darstellung des Zeichens. C hat entsprechende Operatoren für bitweise logische Funktionen.
1 | char c1 = 0xA0; |
2 | char c2 = 0x20; |
3 | int counter = 0; |
4 | |
5 | if ((c1 | c2) != c1) |
6 | counter++; |
Wenn du auch noch die Anzahl der neu hinzugekommen Bits zählen willst, dann z.B. so:
1 | char c1 = 0xA0; |
2 | char c2 = 0x20; |
3 | int counter = 0; |
4 | |
5 | if ((c1 | c2) != c1) |
6 | for (int i=1;i<256;i*=2) |
7 | if (~c1 & c2) & i) |
8 | counter++; |
Oliver
Hi Wenn ich's richtig verstehe, ist A0h und 21h jeweils eine Hex-Zahl. Du möchtest nun wissen, ob sich im unteren Nibble etwas verändert hat. Dazu kannst du bspw. die oberen 4 Bits mit einer Und-Verknüpfung 0Fh ausblenden und dann erhälst du 2 Hex-Zahlen 00h und 01h. Wenn du diese vergleichst, stellst du die Änderung im unteren Nibble leicht fest. Gruß oldmax
Zum Wandeln ASCII->binär gibt es diverse Ansätze. Mit
1 | (x1 & x2) ^ x2 |
erhältst du ein Byte in dem jedes Bit gesetzt ist, das nur in x2 vorkommt.
Hi! wow, danke für die Antworten. A0 soll nich die Hex-Darstellung sein. Ich habe einen String, wie bspw. A000280209. Anschließend erhalte ich bspw. einen String der so aussieht 2100200209. Jedes Zeichen/Zeichenpaar repräsentiert verschiedene Einstellungen des Gerätes, von dem ich die Daten abgreife. Diese möchte ich nun vergleichen. A0 00 28 02 09 21 00 20 02 09 VG
Also ich habs jetzt mal ausprobiert... Allerdings benötige ich für "A" nicht den die binäre Darstellung 0x41, sondern 10(dec). Also im Grunde sind das Ascii-Zeichen, die Hexzahlen darstellen. Für "A" benötige ich also die bin. Darstellung 1010. Muss ich also erst prüfen, ob das Zeichen A <= F ist, dann 0x31 abziehen und dann das Ergebnis mit dem vorherigen String prüfen, oder gibts da ne elegantere Lösung?!
Günther schrieb: > oder gibts da ne > elegantere Lösung?! Ja. Die wird hier auch öfter mal genannt: Kauf dir ein C-Buch. Die allereinfachsten Grundlagen über Datentypen und Operatoren muß man einfach kennen, wenn man eine Programmiersprache einigermassen sinnvoll einsetzen will. Sonst kann das nicht funktiomnieren. Ein char ist ein char ist ein char. Wenn du feststellen willst, ob der sich ein char von einem anderen unterscheidet, gibt es dafür Vergleichsoperatoren. Ein String ist ein Arry of char. Zum Vergleichen von Strings gibt es Funktionen in der Standardlib. Oder du machst es Zeichen für Zeichen... Oliver
Hi Hab mich da irritieren lassen... >1. String: "A0" = 1010 0000 >2. String: "20" = 0010 0000 Ist doch A0h =1010 0000b und 20h 0010 0000b Wenn du da schon Binärcodes hinschreibst, dann auch richtig. Strings sind ASCII -Zeichen, jedenfalls bei Kommunikation mit µC's. Diese Darstellung wäre dementsprechend richtig: 1. String: "A0" = 41h 30h oder binär 01000001 00110000 2. String: "20" = 32h 30h oder binär 00110010 00110000 Wenn du nun wissen willst, ob die Signale unterschiedlich sind und ob du "neue" binäre "1" bekommen hast, wäre eine Exclusiv-Oder Verknüpfung mit anschließender Flankenauswertung denkbar. Alt mit neu Exclusiv Oder. Ergebnis ist bei einem geänderten Bit eine 1. Nun ein Und mit dem neuen Wert und du hast die Flanke 0 nach 1. Reicht'o. In C kann ich dir leider nur den Fahrplan geben, würdest du nach Assembler fragen, wäre es für mich leichter. Gruß oldmax
Sorry und nochmals vielen Danke für die Antwort!
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.