mikrocontroller.net

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


Autor: Günther (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Blubb (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
unsigned char str1[2] = { 'A', '0' };
unsigned char str2[2] = { '2', '1' };
unsigned char result[2];

int i, j;

for(i=0; i<2; i++)   // i<2, da es 2 Buchstaben sind
{
  for(j=0; j<8; j++)
  {
    if( !(str1[i] & (1<<j) && (str2[i] & (1<<j) )
    {
      result[i] |= (1<<j);
    }
  }
}

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
char c1 = 0xA0;
char c2 = 0x20;
int counter = 0;

if ((c1 | c2) != c1)
   counter++;

Wenn du auch noch die Anzahl der neu hinzugekommen Bits zählen willst, 
dann z.B. so:
char c1 = 0xA0;
char c2 = 0x20;
int counter = 0;

if ((c1 | c2) != c1)
for (int i=1;i<256;i*=2)
   if (~c1 & c2) & i)
      counter++;


Oliver

Autor: Martin Vogel (oldmax)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum Wandeln ASCII->binär gibt es diverse Ansätze.

Mit
(x1 & x2) ^ x2
 erhältst du ein Byte in dem jedes Bit gesetzt ist, das nur in x2 
vorkommt.

Autor: Günther (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Günther (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Detlev T. (detlevt)
Datum:

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

0x37 abziehen? ;-)

Autor: Martin Vogel (oldmax)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Günther (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry und nochmals vielen Danke für die Antwort!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.