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


von Jens (Gast)


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
1
 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 ?

von Johann L. (gjlayde) Benutzerseite


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
1
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.

von Dieter (Gast)


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.

von Jens (Gast)


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 ...

von Karl H. (kbuchegg)


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, ....
  ";

von Jens (Gast)


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.

von Johann L. (gjlayde) Benutzerseite


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.
1
#include <stdio.h>
2
3
int main (int argc, char *argv[])
4
{
5
    int i;
6
    FILE *fin;
7
8
    if (2 != argc)
9
    {
10
        fprintf (stderr, "Brauche Name der Eingabedatei\n");
11
        return -1;
12
    }
13
14
    if (0 == (fin = fopen (argv[1], "rb")))
15
    {
16
        fprintf (stderr, "Kann Datei '%s' nicht offnen\n", argv[1]);
17
        return -1;
18
    }
19
20
    printf ("char * data[] = {\n\t");
21
22
    for (i=0; ; i++)
23
    {
24
        int c = fgetc (fin);
25
26
        if (feof (fin))
27
            break;
28
29
        printf ("%s0x%02x%s", i ? ", " : "", c, 15 == i % 16 ? "\n\t" : "");
30
    }
31
32
    printf ("\n};\n");
33
34
    fclose (fin);
35
    fflush (stdout);
36
37
    return 0;
38
}

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

von Jens (Gast)


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?

von Johann L. (gjlayde) Benutzerseite


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).

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.