Wandeln Sie ASCII dargestelltes HEX in HEX um

Ich habe eine Frage, die ich nicht lösen konnte, aber sie schien trivial. Ich erhalte einen Zeichenstrom von einem Prozessor über UART und dieser Strom stellt eine JPEG-Datei dar.

Ich habe diesen Stream als file.txt aufgenommen und kann ihn (sagen wir) in Notepad öffnen und FFD8 sehen ... viele Daten ... FFD9. FFD8 und FFD9 sind JPEG-Start-of-Image- und -Ende-of-Image-Codes, und die Daten dazwischen sind vermutlich das JPEG-Bild. Ich möchte dieses Bild anzeigen, aber das Problem ist, dass diese Daten HEX-Zeichen darstellen (z. B. FFD8), aber da es sich um eine Textdatei handelt, handelt es sich eigentlich nur um ASCII, und daher kann ich sie nicht als JPEG öffnen.

Gibt es ein Programm oder ein Dienstprogramm, mit dem ich diese Datei, die "ASCII HEX" enthält, in eine echte Binärdatei konvertieren kann, damit ich sie als JPEG-Datei anzeigen kann?

Danke!

Die Standard-C-Funktion für diese Konvertierung ist atoi(). Wenn Sie es googeln, finden Sie andere, die für ganzzahlige Längen und andere Dinge optimiert sind.
Welcher Mikroprozessor oder Mikrocontroller? Welcher Compiler?
Sie könnten die Zeichen einzeln lesen und mithilfe einer Nachschlagetabelle (oder eines Switch-Case usw.) in den entsprechenden Wert konvertieren und sie in einen Softwarepuffer einfügen, der den Puffer / Stream für diesen Frame darstellt, und alles auf 0 zurücksetzen zwischen jedem gestreamten Frame?
Mikrocontroller ist STM32F4 mit dem GCC-Compiler.

Antworten (2)

Zuerst benötigen Sie eine kurze Unterroutine, um jedes Hex-4-Bit-Nibble in Binärwerte umzuwandeln, und speichern Sie dann die Nibbles als 8-Bit-Binärwerte.

unsigned char hextobin (unsigned char digit)
{
    unsigned char value;

    if ((toupper(digit) >= 'A')&&(toupper(digit) <= 'F'))
    {
        value = (digit - 'A') + 10;
    }
    else if ((digit >= '0') && (digit <= '9'))
    {
         value = digit - '0';
    }
    else
    {
         value = 255;    // error - not handling this below
    }
    return value;
}

Rufen Sie dann für jeweils zwei Hexadezimalzeichen die obige Routine zweimal auf; Wenn Sie sie beispielsweise in einer Schleife eingeben, etwa so:

    unsigned char nibble1, nibble2, byte;

// assume inside a loop getting a characters from UART

{

    nibble1 = gethexchar();    // ssume gets one ASCII char 0-9 or A-F
    nibble2 = gethexchar();

    byte = 256 * hextobin(nibble1) + hextobin(nibble2);

    // can save byte off to buffer or write to file
}

Ich habe einen einfachen Weg gefunden, dies zu tun, obwohl die obige Antwort von tcrosley auch richtig ist.

Mein Weg bestand darin, den Code auf dem Mikroprozessor zu ändern, um die Daten mit einem %c-Formatbezeichner anstelle des ursprünglich verwendeten %x-Formatbezeichners auszugeben.

Dann erfasse ich die Daten mit RealTerm in einer Datei.

Dann öffne ich die Datei mit einem HEX-Editor (hexplorer), um zu überprüfen, ob sie mit FFD8 beginnt und mit FFD9 endet (normalerweise muss ich einige Zeichen am Ende der Datei löschen, dies wird hinzugefügt, weil die Firmware die Datei sendet).

Dann benenne ich die Datei in die Erweiterung jpg um und sie kann mit jeder Bildbetrachtungssoftware geöffnet werden.

Danke für die Hilfe an alle!