Hex zu Buchstaben Übersetzer Typproblem

Hallo,
ich habe ein Problem mit meinem Programm, welches Hex Code in normale Buchstaben umwandeln soll. Es soll eine Zahlen und Buchstabenfolge im seriellen Monitor eingegeben werden, die dann ausgelesen und in verständliche Buchstaben übersetzt werden soll.
Eine Eingabe wäre beispielsweise:
48656C6C6F20576F726C64
Als Ausgabe soll dann ein "Hello World" erscheinen.

Jetzt habe ich aber das Problem, dass ich die Variablen zum Auslesen als String angelegt habe und wenn ich sie nun in den passenden Buchstaben übersetzen möchte geht es nicht.

Serial.println(char(0x63));
funktioniert,

Serial.println(char(Variablenname));
aber nicht, obwohl 'Variablenname' 0x63 enthält

Die Fehlermeldung lautet: 'Invalid cast from type string to type char'


String Geheimzahl;
String SuperGeheim;
char Eingabe[100];
int i=1;
void setup() {
  Serial.begin(9600);
}

void loop()
{   i=1;
    while (Serial.available())
    {
     if (i%2!=0)
     {
      Eingabe[i] = Serial.read();
      Geheimzahl=Eingabe[i];
      SuperGeheim="0x";
      i++;
      }

       else
      {
      Eingabe[i] = Serial.read();
       Geheimzahl += Eingabe[i];
       SuperGeheim+=Geheimzahl;
//       Serial.println(char(0x63));
//       Serial.println(char(SuperGeheim));
       i++;

      }
    }
 }

Würde mich freuen, wenn mir (Schülerin) jemand helfen könnte :slight_smile:
Gruß LieselDieGroße

Enthält und ist gleich sind 2 Paar Schuhe.
Ist sicher gestellt, dass die Hex-Folgen immer 2-stellig sind?
Wenn ja, dann lies immer die 2 Zeichen in ein char-Array der Länge 3 mit '\0' hintendran ein, wandle das mit strtol in eine Zahl und gib diese als Zeichen aus.
Oder nutze sscanf.

Gruß Tommy

Hallo Tommy,
vielen Dank für Deine schnelle Antwort!
Ja, für normalen Text ist Hex immer zweistellig. Dec hat auch mal drei Stellen.
Allerdings gibt es auch Buchstaben, kann ich da dann noch das ganze in eine Zahl umwandeln?

Gruß LieselDieGroße

Du brauchst die Zwischenstufe Zahl (Char/Byte), um den ASCII auszugeben.
Warum muss die Eingabe unbedingt in Hex erfolgen?

Gruß Tommy

Es ging nur darum zu vermeiden, dass unterschiedliche Stellenanzahlen (bei Dec entweder 2 oder drei Stellen) berücksichtigt werden müssen. Vielleicht könnten wir ja Oct benutzen, da sind es immer 3 Zahlen.

Gruß LieselDieGroße

Wenn ihr jede komplette Zahl (= Zeichen) mit einem Zeilenvorschub (NL, '\n') abschließt, ist die Stellenzahl egal.
Warum übergebt ihr nicht einfach die Zeichenkette, die ihr haben wollt?
Also z.B. "Hallo"?

Gruß Tommy

Es soll eine Geheimpost sein. Wir möchten keinen offenen Text übergeben (da bräuchte es ja dann auch kein Programm zu...). Auch sollen die einzelnen Buchstaben nicht sichtbar voneinander getrennt sein. Einfach nur ein Block aus Zahlen/Buchstaben und man kann diesen Block nur mit unserem Programm entziffern. Auch wenn man das Program selber vorliegen hat, darf nicht ersichtlich sein, was hinten rauskommt.

Gruß Liesel

Also eine Hex-Übertragung hat nichts mit geheim zu tun. Das bekommt jeder aufgedröselt. Die 2. Bedingung

widerspricht der ersten Vorgabe:

Das ganze ist also absolut nicht durchdacht. Wenn es etwas ordentliches werden soll, dann beschäftigt Euch intensiv mit dem Thema Verschlüsselung.

Gruß Tommy

Mit 'Programm selber' war 'Programm alleine, ohne den Zahlenblock' gemeint.

Es soll nichts 'ordentliches' oder 'professionelles' oder sonstwas werden.
Es geht hier um eine 'Dankeschön-Karte' für unseren Informatik Lehrer. Wir dachten, das wäre vielleicht lustig für ihn. Wir wollten ihm nur eine kleine Nettigkeit mitgeben, da nächste Woche unsere letzte Stunde bei ihm ist. Wir sind nicht unbedingt seine strahlendste Klasse in Punkto Programmieren. Wir haben auch nur Lichter an und aus und einen Entfernungssensor programmiert. Das Programm oben ist Neuland für uns, es hat bis zu diesem Zustand einen Tag gebraucht und viel Forschen im I-Net.
Aber Du hast Recht, ein Stückchen Papier tuts natürlich auch.

Gespalten ist mein Herz, denn die gute Absicht ist schön, aber soll ich hier eine Lösung zeigen?

Ihr seit hoffentlich alt genug, die Entscheidung, was Ihr wie macht, selbst zu treffen. Kärtchen mit Foto und dem von Euch initiierten Programm kommt bestimmt gut an. Quellenangabe nicht vergessen :wink:

Getestet mit UNO:

char eingabe[100];
char ausgabe[50];
uint8_t i = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("\nStart ...");
}

void loop()
{
  while (Serial.available())
  {
    eingabe[i] = Serial.read();
    if (eingabe[i] == '\n')
    {
      eingabe[i + 1] = '\0';
      Serial.print("eingabe: ");
      Serial.print(eingabe);
      for (uint8_t a = 0; a < i; a += 2)
      {
        ausgabe[a / 2] = 0x10 * h2z(eingabe[a]) + h2z(eingabe[a + 1]);
        Serial.print(h2z(eingabe[a]), HEX);
        Serial.print(h2z(eingabe[a + 1]), HEX);
        Serial.print('-');
        Serial.print(ausgabe[a / 2], HEX);
        Serial.print(' ');
      }
      Serial.print("\nausgabe: ");
      Serial.println(ausgabe);
      i = 0;
    } else {
      if (i < sizeof(eingabe) - 1) i++;
    }
  }
}

uint8_t h2z(char z)
{
  uint8_t r = 255;
  if (z >= '0')
  {
    r = z - '0';
    if (z >= 'A') r -= 'A' - ':';
  }
  return r;
}

Besonderen Spaß hat mir die Buchstabenarithmetik gemacht :crazy_face:

Bei Fragen bitte fragen!

Danke! Wir schauen uns das Programm genauer an und googeln das Unbekannte (wird eine Weile dauern...). Danach können wir hoffentlich konkrete Fragen stellen :slight_smile:

Gruß Liesel

Hallo agmue,
Deine Buchstabenarithmetik ist wirklich beeindruckend!
Ich bin mir nicht ganz sicher, ob ich das Ganze verstanden habe. Es ist noch ein wenig schwierig zu verstehen, wie der Arduino 'denkt'.
Wie funktioniert das Rechnen mit char? Ist es korrekt, dass die dazugehörigen Dez-Werte addiert/subtrahiert werden? Also bei
r -= 'A' - ':'
255-(65-58)=248?
Was passiert in der Berechnung für die Ausgabevariable?

0x10 * h2z(eingabe[a]) + h2z(eingabe[a + 1]);

Das '0x10*' irritiert mich.
Was ist das Ergebnis wenn ich beispielsweise 4A, also 'J' eingelesen habe?

In der Funktion h2z trennst Du Zahleneingaben von Buchstabeneingaben, oder? Was bewirkt
r = z - '0';?
Könnte man da auch einfach r=z; sagen?
Könnte man die ganze if-Struktur umstellen in:

if (z >='A') r-='A'-':';
else r=z;

Die binären Werte werden verrechnet.... Ihm kann nur binär rechnen.
Dezimal, Oktal, Buchstaben usw sind nur Darstellungen/Präsentationen für uns Menschen.

Entspricht meinem out <<= 4;


char text[] = "48656C6C6F20576F726C64";

byte char2nibble(char c)
{
  switch(c)
  {
    case '0'...'9' : return c-'0';
    case 'A'...'F' : return c-'A'+10;
  }
  Serial.print("error");
  return 0;
}

void setup() 
{
  Serial.begin(9600);

  char out;
  bool pos = false;
  for(char c:text)
  {
   if(!c) break;
   if(pos)
   {
     out <<= 4;
     out += char2nibble(c);
     Serial.write(out);
     pos = false;
   }else
   {
     out = char2nibble(c);
     pos = true;
   }
    
  }
}

void loop() 
{

}

Da hilft ein Blick in die ASCII-Zeichentabelle:

r -= 'A' - ':';  // 0x41 - 0x3A = 7
r = r - 7;       // hier erkennt man nicht den Sinn der 7

Das linke Nibble hat den Wert 16 = 0x10, daher multipliziere ich damit.

Nee, denn das Zeichen '0' hat den Wert 0x30:
r = z - 0x30;

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.