mikrocontroller.net

Forum: Compiler & IDEs Text in Zahlen, Problem 0 wird zu 0x20


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte eine Datei, die nur Zahlen beinhaltet mit einem uC 
verarbeitet.

Ich nehme als Beispiel eine MIDI-Datei. Ich öffne die Datei im 
Text-Editor. Kopiere als Test etwas aus dem Inhalt in ein uint8_t
 uint8_t    Test[] = {"MThd         ðMTrk    "}; 

Nun lese ich die einzelnen char aus und siehe da, alles bestens -- bis 
auf die Leerzeichen, die sind immer 0x20, alles andere stimmt -- 4D 54 
68 64  20 (die eigentlich eine 0 sein müsste).

Gibt es eine Lösung, denn ab und zu gibt es ja auch eine 20?

Oder muss man eine if Bedingung für das Leerzeichen setzen ?

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kann so nicht gehen, vielleicht für einige Codes, aber nicht für 
alle.

Um das nach C umzuwandeln, könntest Du so vorgehen:

In einer Programmiersprache Deiner Wahl (C, Java, Brainfck, Intercal, 
...) liest Du die Datei binär ein und schreibst einen String, der für 
jedes Zeichen die Oktal-Sequenz enthält, zB
char * midi = "\000\101\000"; 

Für die drei Werte 0x0, 0x41 bzw 'A', 0x0.

Druckbare Zeichen kannst natürlich auch direkt hinschreiben, dann wirds 
lesbarer.

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
0x20 ist in diesem Fall ja richtig, denn das ist der ASCII-Code des 
Leerzeichens.
Das Zeichen mit dem Wert Null ist im Texteditor nicht darstellbar und 
kommt in keiner Text- oder MIDI-Datei vor.

Such für weitere Infos am besten mal nach ASCII-Tabelle.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verstehe ich nicht so richtig.

Die Dateien, die ich benutzen will sind ca. 8KB groß - bis auf die 0x20, 
die = der 0 ist, funktioniert es bequem, die Datei im Editor zu öffnen 
und dann nur noch die "" davor und dahinter zu schreiben.
Wie lese ich die Datei und wohin ein und wie bekomme ich das dann ins 
AVR Studio? Könntest Du das genauer erklären?

Danke ...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens wrote:
> Verstehe ich nicht so richtig.
>
> Die Dateien, die ich benutzen will sind ca. 8KB groß - bis auf die 0x20,
> die = der 0 ist, funktioniert es bequem, die Datei im Editor zu öffnen

Glaub ich nicht.
SIcherlich kannst du die Datei in einem Editor öffnen, nur bleibt
die Hälfte des INhalts dabei auf der Strecke.
Nämlich alle Codes, für die es kein entsprechendes ASCII
Zeichen mit diesem Code gibt.

> und dann nur noch die "" davor und dahinter zu schreiben.
> Wie lese ich die Datei und wohin ein und wie bekomme ich das dann ins
> AVR Studio? Könntest Du das genauer erklären?

Hat er doch schon.
Du schreibst dir auf dem PC ein Hilfsprogramm, welches dir
den Dateiinhalt in korrekter Form in eine Array Initialisierung
umwandelt, so dass du ihn in deinem Programm auch benutzen
kannst.
Dieses Hilfsprogramm läuft auf dem PC(!) und erzeugt dir
zb dieses hier

unsigned char bytes[] = "
  0x41, 0x00, 0x58, 0x2F, 0x10, ....
  ";

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also z.B. in Delphi o.a. ein Programm schreiben, welches die Datei 
ausliest und sie neu schreibt bzw. ausgibt?

Übrigens mit dem Editor wird doch alles angezeigt, auch viele 
Lehrzeichen  für die Nulln eben.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieter wrote:

> Das Zeichen mit dem Wert Null ist im Texteditor nicht darstellbar und
> kommt in keiner Text- oder MIDI-Datei vor.

Doch, 0 kommt in midi-Dateien vor, abenso wie andere nicht-druckbare 
Zeichen.
#include <stdio.h>

int main (int argc, char *argv[])
{
    int i;
    FILE *fin;

    if (2 != argc)
    {
        fprintf (stderr, "Brauche Name der Eingabedatei\n");
        return -1;
    }

    if (0 == (fin = fopen (argv[1], "rb")))
    {
        fprintf (stderr, "Kann Datei '%s' nicht offnen\n", argv[1]);
        return -1;
    }

    printf ("char * data[] = {\n\t");

    for (i=0; ; i++)
    {
        int c = fgetc (fin);

        if (feof (fin))
            break;

        printf ("%s0x%02x%s", i ? ", " : "", c, 15 == i % 16 ? "\n\t" : "");
    }

    printf ("\n};\n");

    fclose (fin);
    fflush (stdout);

    return 0;
}

0) gcc besorgen, ist bei Linux anbei oder zB bei Code::Blocks (Win32, 
Linux, MacOS)
1) Abspeichern als "file-to-string.c"
2) gcc -O2 file-to-string.c -o file-to-string.exe
3) file-to-string.exe input.midi > output.c

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe die Code::Blocks runter geladen und Deine Datei als C-Datei 
abgespeichert. Ich muss jetzt dumm fragen - wie komme ich zu der exe?

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ne Shell/Kommandozeile aufmachen (sh, bash, cmd.exe, ...) und 2) 
ausführen, d.h. eintippen + <RETURN>. Gibt im gleichen Verzeichnis die 
exe oder eben das, was hinter der -o Option steht.

Oder ein C::B-Projekt anlegen, aber das weiß ich net auswendig (hab das 
C::B auch nur um gcc per Kommandozeile nutzen zu können).

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.