Suche Konverter: HTML-Datei in C-Quelltext

#2777021
Lesenswert?

Ich hab mir für sowas schnell in Tool in BCB zusammengehackt.
- öffne Datei (egal welcher Typ) zum Lesen
- öffne Datei neu zum Schreiben
- lese ein Byte
- schreibe "0x" und Hex(Byte) und ", "
- wiederhole bis anzahl=16 , schreibe "\r\n"
- wiederhole bis dateiende
- schliessen beider dateien
Klammern drum, Variablenname davor, fertsch
#2777041
Lesenswert?

Jürgen schrieb:
> Für einen AVR-NET-IO Webserver habe ich eine HTML-Seite erstellt und
> diese soll in den Quelltext (Beispiel siehe Anhang) eingebunden werden.
>

Ja, ok.
Schreib dir ein Tool welches den Text aufbereitet und in einer neuen 
Datei ablegt. Und die inkludest du dann ganz einfach
1
char Text[] = {
2
#include "index.html"
3
};

Einzig die Aufbereitung müsstest du dir halt schreiben. Aber das ist ja 
für einen C-Programmierer kein Hexenwerk. Im Grunde brauchst du nicht 
mehr tun, als vor jede Zeile ein " setzen, am Ende einer Zeile ein " 
setzen und ein paar Buchstaben durch andere zu ersetzen. Zb " durch \", 
\ durch \\, Tabulator durch \t und noch ein paar andere.
Ist ein einfaches C-Programm welches diese Aufbereitung macht und 
eigentlich sollte jeder C-Programmierer in der Lage sein, sich in einer 
halben Stund ein entsprechendes Tool zu machen. Ja, manchmal macht man 
sich seine Werkzeuge auch selber, weils einfach schneller geht als 2 
Stunden nach einem Tool zu suchen. Hat man natürlich einen 
entsprechenden Editor, dann kann auch der die Aufbereitung mittels 
Makro-Programmierung machen oder man benutzt einen Stream-Editor wie 
"sed" für solche Aufgaben. Je nach Lust und Laune und Tools die man hat 
und die man kennt.

Aus
1
<html>
2
<body>
3
Dies ist "meine" Seite
4
</body>
5
</html>


wird dann eben nach der Aufbereitung
1
"<html>"
2
"<body>"
3
"Dies ist \"meine\" Seite"
4
"</body>"
5
"</html>"
und das ist perfekt, um als String durch den C-Compiler zu gehen.
#2777239
Lesenswert?

Ich habe sowas in Perl geschrieben. Das Programm konvertiert alle 
Dateien in einem Verzeichnis in C Arrays. Unter Windows empfehle ich 
Strawberry Perl, falls Du noch kein Perl installiert hast.

http://stefanfrings.de/qtwebapp/QtWebApp-src.zip

Darin ist es die Datei makefsdata. Du kannst auch abgucken, wie ich es 
in mein Makefile eingebunden habe. Das Ergebnis sieht z.B. so aus:
1
prog_char data_404_html[] = {
2
  /* /404.html */
3
  0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0,
4
  /* file data */
5
  0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, 0x20, 0x20, 0x3c, 
6
  0x62, 0x6f, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 
7
  0x6f, 0x72, 0x3d, 0x22, 0x77, 0x68, 0x69, 0x74, 0x65, 0x22, 
8
  0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x63, 0x65, 0x6e, 
9
  0x74, 0x65, 0x72, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 
10
  0x20, 0x3c, 0x68, 0x31, 0x3e, 0x34, 0x30, 0x34, 0x20, 0x2d, 
11
  0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 
12
  0x66, 0x6f, 0x75, 0x6e, 0x64, 0x3c, 0x2f, 0x68, 0x31, 0x3e, 
13
  0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x68, 0x33, 
14
  0x3e, 0x47, 0x6f, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 
15
  0x66, 0x3d, 0x22, 0x2f, 0x22, 0x3e, 0x68, 0x65, 0x72, 0x65, 
16
  0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 
17
  0x61, 0x64, 0x2e, 0x3c, 0x2f, 0x68, 0x33, 0x3e, 0xa, 0x20, 
18
  0x20, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x65, 0x6e, 0x74, 0x65, 
19
  0x72, 0x3e, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 
20
  0x79, 0x3e, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 
21
  /* additional end marker */
22
  0};
23

24
prog_char data_raster_png[] = {
25
  /* /raster.png */
26
  0x2f, 0x72, 0x61, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x70, 0x6e, 0x67, 0,
27
  /* file data */
28
  0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 00, 00, 
29
  00, 0xd, 0x49, 0x48, 0x44, 0x52, 00, 00, 00, 0x8, 
30
  00, 00, 00, 0x8, 0x1, 0x3, 00, 00, 00, 0xfe, 
31
  0xc1, 0x2c, 0xc8, 00, 00, 00, 0x1, 0x73, 0x52, 0x47, 
32
  0x42, 00, 0xae, 0xce, 0x1c, 0xe9, 00, 00, 00, 0x6, 
33
  0x50, 0x4c, 0x54, 0x45, 0xf0, 0xf0, 0xf0, 0xfa, 0xfa, 0xfa, 
34
  0x75, 0xcf, 0x2, 0x1f, 00, 00, 00, 0x9, 0x70, 0x48, 
35
  0x59, 0x73, 00, 00, 0xb, 0x13, 00, 00, 0xb, 0x13, 
36
  0x1, 00, 0x9a, 0x9c, 0x18, 00, 00, 00, 0x7, 0x74, 
37
  0x49, 0x4d, 0x45, 0x7, 0xd8, 0x3, 0x1f, 0x8, 0x11, 0x30, 
38
  0x6, 0x70, 0x4b, 0xff, 00, 00, 00, 0x1b, 0x49, 0x44, 
39
  0x41, 0x54, 0x8, 0x1d, 0x1, 0x10, 00, 0xef, 0xff, 00, 
40
  00, 00, 0x7f, 00, 0x7f, 00, 0x7f, 00, 0x7f, 00, 
41
  0x7f, 00, 0x7f, 00, 0x7f, 0x18, 0x5f, 0x3, 0x7a, 0x19, 
42
  0x23, 0xd7, 0x75, 00, 00, 00, 00, 0x49, 0x45, 0x4e, 
43
  0x44, 0xae, 0x42, 0x60, 0x82, 
44
  /* additional end marker */
45
  0};
46

47
struct httpd_fsdata_file file_404_html[] = {{0, data_404_html, data_404_html + 10, 160}};
48

49
struct httpd_fsdata_file file_raster_png[] = {{file_404_html, data_raster_png, data_raster_png + 12, 155}};
50

51
#define HTTPD_FS_ROOT file_raster_png
52

53
#define HTTPD_FS_NUMFILES 2

Erklärung dazu:

Die Arrays enthalten jeweils Dateiname und Datei-Daten nacheinander. Die 
Strukturen enthalten das Inhaltsverzeichnis, jeweils eine Struktur pro 
Datei:

1) Zeiger auf die Struktur der nächste Datei
2) Zeiger auf den Dateinamen
3) Zeiger auf die Datei-Daten
4) Größe der Datei in Bytes

HTTPD_FS_ROOT zeigt auf die Struktur der ersten Datei. Wenn man eine 
Datei mit einem bestimmten Namen zur Laufzeit suchen will, beginnt man 
bei der ersten Datei und hangelt sich über die Zeiger von Struktur zu 
Struktur. Das Ende der Kette ist durch eine 0 gekennzeichnet.

Im obigen Beispiel ist die erste Datei in der Kette file_raster_png (mit 
dem Dateinamen "/raster.png"). Deren Struktur zeigt an, dass die nächste 
Datei file_404_html (mit dem Dateinamen "/404.html") ist. Deren Struktur 
wiederum zeigt auf nichts (0), weil es die letzte Datei in der Kette 
ist.

PS: Falls mir jemand verraten kann, wie ich die Formatierung der 
Hexadezimal-Zahlen elegant einheitlich gestalten kann, so dass alle 
Zeilen immer genau gleich lang sind, würde ich mich freuen. Ich bin 
eigentlich kein Perl Spezialist, deswegen habe ich es nicht schöner 
hinbekommen.
#2777703
Lesenswert?

@Joerg
Dankeschön. So sind schonmal alle Hexadezimazahlen zweistelling. Ich 
habe auch herausgefunden, wie man die Sonderbehandlung der 0 Werte 
einsparen kann:

printf DFILE "0x%2.2x",$byte_wert;

Ist eigentluch ganz naheliegend. Nur manchmal sehen wir den Wald vor 
lauter Bäume nicht :-)

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