Forum: Compiler & IDEs Binär --> Hex


von Matthias Jung (Gast)


Lesenswert?

Ich habe ein Bitfeld, mit lauter binären Werten bestimmt.
struct
  {
     unsigned char 3_3V:1;
     unsigned char 5V:1;
     unsigned char 12V:1;
     unsigned char _12V:1;
     unsigned char STDBY:1;
     unsigned char TEMP_Lueft:1;
     unsigned char OK:1;
     unsigned char no_sysFail:1;
     } Status_Request;

Es gibt doch bestimmt eine schlaue Funktion, die mir daraus den
entsprechenden hex Wert berechnet.

Danke schon mal

von Karl H. (kbuchegg)


Lesenswert?

Nimm ne union.

  union Convert
  {
    struct Leider_hast_du_der_struct_keinen_Namen_gegeben Status;
    unsigned char Value;
  }

  union Convert tmp;
  tmp.Status = Status_Request;
  unsigned char i = tmp.Value;

Wenn ich mirs recht überlege, könnte das auch mit
einem simplen cast gehen:

  unsigned char i = (unsigned char)Status_Request;

schlimmstenfalls müsste man machen:

  unsigned char i = *(unsigned char*)&Status_Request;

Oder du könntest überhaupt deine struct verändern:


struct
{
  union
  {
    unsigned char AllBits;
    struct
    {
      unsigned char 3_3V:1;
      unsigned char 5V:1;
      unsigned char 12V:1;
      unsigned char _12V:1;
      unsigned char STDBY:1;
      unsigned char TEMP_Lueft:1;
      unsigned char OK:1;
      unsigned char no_sysFail:1;
    }
  } Status_Request;

dann kannst du über STDBY etc. die einzelnen Bits setzten
und über AllBits kannst du auf alle Bits gemeinsam zugreifen.

Der Möglichkeiten sind da viele. Nur eines noch: Einen
Variablennamen ala 5V oder 12V wird der der Compiler nicht
akzeptieren. Namen von Variablen können nicht mit einer Ziffer
beginnen.

von Karl H. (kbuchegg)


Lesenswert?

Ooops. Da hab ich wohl eine schliessende } vergessen.
Sah gleich so seltsam aus:

struct
{
  union
  {
    unsigned char AllBits;
    struct
    {
      unsigned char 3_3V:1;
      unsigned char 5V:1;
      unsigned char 12V:1;
      unsigned char _12V:1;
      unsigned char STDBY:1;
      unsigned char TEMP_Lueft:1;
      unsigned char OK:1;
      unsigned char no_sysFail:1;
    }
  }
} Status_Request;

von Matthias Jung (Gast)


Lesenswert?

Danke, für die ausführliche Auswahl, werds gleich mal probieren. Das
Variablen Namen Problem hab ich schon behoben.
Danke

von Matthias Jung (Gast)


Lesenswert?

Ich hab doch noch mal ne Frage!

Ich brauche "AllBits" in Hex, also wenn vorher 0101 1100 brauch ich
die Binärzahl als Hex, dementsprechend hier 5C. Wo, oder mit was wird
das bei deinen Vorschlägen gewandelt?

Vielleicht bin ich auch nur zu kurzsichtig um es zu sehen, dann sorry.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Definiere ,,in Hex''.  Willst du es auf einer UART ausgeben?
Dann brauchst du einen String und eine Routine, die dir eine
interne (Binär-)Zahl in einen String umwandelt, z. B. itoa()
oder sprintf().  Oder was soll sonst damit passieren?

von Matthias Jung (Gast)


Lesenswert?

Genau, das habe ich vor, das Ganze soll  über den UART ausgegeben
werden. Das Ausgabeformat, ist schon fest, daher in hex.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ja, dann halt nach itoa() oder sprintf() gucken im Manual.
sprintf() kann das auf jeden Fall [sprintf(buf, "%02x", i);],
ist nur die Frage, ob du den Code-Overhead tolerieren kannst,
da es eine eierlegende Wollmilchsau ist.

von Matthias Jung (Gast)


Lesenswert?

Was ist denn Code-Overhead?
Also den Beschreibungen nach, müsste es auch mit ITOA() gehen. Ich
werds mal mit itoa() probieren. Allerdings muss ich dann mein Bitfeld
von char in int abändern, damit es mir itoa() in einen String im Hex
Zahlensystem wandeln kann.
Danke für deine Hilfe

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

ITOA() gibt es nicht.  C ist case sensitive.

Das Problem von itoa() ist nur, dass du keine Vornullen direkt
ausgegeben bekommst, das müsstest du dir mit der Hand dran
stricken.

> Allerdings muss ich dann mein Bitfeld von char in int abändern,
> damit es mir itoa() in einen String im Hex Zahlensystem wandeln
> kann.

Wie kommst du darauf?  Hast du die Parameterübergabe von C nicht
verstanden?

Allerdings sollte der "char" wohl "unsigned char" sein, damit du
nicht in sign extension Probleme rennst, oder gleich "uint8_t"
(Definition steht in <stdint.h>, C99 genormt).  Außerdem besser
utoa() benutzen oder den Wert erst nach (unsigned int) casten.

> Was ist denn Code-Overhead?

Die Codegröße, die sprintf() mit sich herumschleppt, da es eben
alles Mögliche und Unmögliche konvertieren kann.  (Lediglich
Gleitkomma ist in der Standardversion weggelassen.)

Ist also einfach eine Frage, wie viel Platz du im ROM übrig hast.
sprintf() ist die Rundum-Sorglos-Version, da es alle Dinge wie
führende Nullen, Hexziffern wahlweise in Groß- oder
Kleinbuchstaben etc. pp. erledigt.  Wenn ich Platz im ROM habe,
würde ich dem stets den Vorzug vor einer do-it-yourself-Lösung
geben.  Denk dran, ROM sparen ist gut und schön, aber Atmel gibt
dir nichts zurück, wenn du von 16 KB ROM nur 12 KB benutzt. ;-)

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.