mikrocontroller.net

Forum: Compiler & IDEs Konvertierung Char in Binärstring


Autor: Fabian Höflinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
wie kann ich ein Char zum Beispiel 'A' in einen
Binärstring Umwandeln also  ==> "01000001". In C.


  char Buffer[9];
  int i;
  char Wert;

  for (i = 0; i < 8; i++)
    Buffer[i] = (Wert & (1 << (7 - i)) ? '1' : '0';

  Buffer[8] = '\0';


funktioniert leider nicht.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum ist "i" ein int? Kann doch höchstens 7 sein. Mach da lieber
einen (unsigned) char draus!

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was bitte bedeutet "funktioniert leider nicht"?

Was passiert denn?

Autor: Fabian Höflinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Compiler des Atmega128 stürzt leider ab.

Es liegt wohl an dieser Zeile:
Buffer[i] = (Wert & (1 << (7 - i)) ? '1' : '0';

Gruß fabin

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Compiler stürzt ab? Dann solltest du einen Bugreport einreichen.
Aber das hat dir die Crashmeldung dann schon gesagt.

Autor: Detlev (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das es am Compiler liegt, musst du schon mitteilen. Woher sollen
diejenigen das wissen, deren Kristallkugel gerade zur Inspektion ist?

Alternativer Code (Ich mag den ?-Operator sowieso nicht):

Buffer[i] = '0';
if(Wert & (1 << (7 - i)) Buffer[i] |= 1;

Autor: Fabian Höflinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weiß jemand von euch eine andere Möglichkeit? Die auch sehr einfach ist.

Autor: Detlev (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder:

Buffer[i] = '0';
if(Wert & (1 << (7 - i)) Buffer[i] = '1';

(iss noch besser.)

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würd's ganz umformulieren (aber den ?:-Operator drnilassen):

  char Buffer[9];
  uint8_t i;
  char Wert;
  char* p = Buffer;

  for (i = 1 << 7; i; i >>= 1)
    *p++ = (Wert & i) ? '0' : '1';

  Buffer[8] = '\0';

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups.. muß natürlich heißen:

    *p++ = (Wert & i) ? '1' : '0';

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder (um die doppelte Zuweisung von Detlev zu vermeiden):

Buffer[i] = ((Wert >> (7-i)) & 0x01) | '0';

Gibt also genug Lösungen. Allerdings ist das '?' etwas unleserlich.
Zudem meint mein avr-gcc es nicht zu kennen ;-(

Grüße, Freakazoid

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann nicht sein. gcc kennt diesen Operator. Was hast du genau
geschrieben und was hat der Compiler ausgespuckt?

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Main.c:29: error: parse error before ';' token
Main.c:34: error: parse error before ')' token

Geschrieben:
Das von oben (1.Post). Allerdings nochmal Klammern um den if-Block.
Wollte er nämlich auch nicht. Vielleicht hab ich ihn auch
tot-crosscompiliert ;-)

Ist aber auch nicht so wichtig. Wenn ich lustige If-Statements brauche,
nehme ich Perl 'Mach das und das und das IF (....)' ;-)

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso:
Zeile 29 war wohl die mit dem '?'. Dann war er verwirrt und wollte
kein ')' im weiteren Code mehr ;-)

Ich hab das Stück in einem vorhandenen Code reingepostet (deswegen
29...34). Die Sache mit dem '?' hatte ich aber schon öfters.

Grüße, Freakazoid

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Originalposting gibt's auch drei öffnende Klammern und nur zwei
schließende.

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sauerei. Vielleicht meinte der OP auch das mit dem 'Compilerabsturz'
;-)
Da war ich direkt zu faul zum Klammernzählen ;-(
Asche auf mein Haupt.

Grüße, Freakazoid

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"weiß jemand von euch eine andere Möglichkeit? Die auch sehr einfach
ist."

jup. Die Funktion itoa.

itoa (zahl,string,2);

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sofern sie angeboten wird. Das ist nämlich keine Standardfunktion.

Autor: Fabian Höflinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry

da habe ich wohl eine Klammer zuviel gemacht.

Komisch das der Compiler es nicht erkannt hat. Der Conrad Compiler ist
wohl nicht so gut.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uhm, Conrad? Da du im gcc-Forum gepostet hast, war ich davon
ausgegangen, daß du auch gcc benutzt.

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dachte ich auch. Abgesehen davon, daß erst beim zweiten Post der AVR als
Zielplatform bekannt wurde. Was ist denn ein 'Conrad'-Compiler? Doch
wohl kein Mist vom blauen C, oder?

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Argh. Befürchtung bestätigt. Scheint der Compiler der C-Control zu sein
(da paßt auch AVR). Furchtbar ;-(

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.