Forum: Mikrocontroller und Digitale Elektronik ASCII in Binär: Bitweises Vergleichen zweier Zeichen


von Günther (Gast)


Lesenswert?

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

von Blubb (Gast)


Lesenswert?

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
}

von Oliver (Gast)


Lesenswert?

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

von Martin V. (oldmax)


Lesenswert?

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

von Detlev T. (detlevt)


Lesenswert?

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.

von Günther (Gast)


Lesenswert?

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

von Günther (Gast)


Lesenswert?

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?!

von Oliver (Gast)


Lesenswert?

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

von Detlev T. (detlevt)


Lesenswert?

Günther schrieb:
> oder gibts da ne elegantere Lösung?!

0x37 abziehen? ;-)

von Martin V. (oldmax)


Lesenswert?

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

von Günther (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.