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:
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
charc1=0xA0;
2
charc2=0x20;
3
intcounter=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:
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
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