Text in Zahlen, Problem 0 wird zu 0x20

Gast #909674
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 ?
Persönliche Seite #909687
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.
Gast #909691
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.
Gast #909702
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 ...
#909713
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, ....
  ";
Gast #909718
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.
Persönliche Seite #909719
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren