Forum: Mikrocontroller und Digitale Elektronik Suche Konverter: HTML-Datei in C-Quelltext


von Jürgen (Gast)


Lesenswert?

Hallo,

gibt es ein Programm, das eine HTML-Datei in einen C-Quelltext (ARRAY) 
konvertiert?

mfg

Jürgen

von Timm R. (Firma: privatfrickler.de) (treinisch)


Lesenswert?

Hallo,

was genau willst Du denn machen?
Kannst Du nicht einfach das Html durch

google: Addslashes Stripslashes Escape string

jagen und dann in einen char* schreiben?

Vlg
 Timm

von Rangi J. (rangi)


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

von Jürgen (Gast)


Angehängte Dateien:

Lesenswert?

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

mfg

Jürgen

von Karl H. (kbuchegg)


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.

von Oliver R. (sourcebox)


Angehängte Dateien:

Lesenswert?

Wenn du ein System hast auf dem Python zur Verfügung steht, dann 
versuche das beigefügte Skript. Könnte ggfs. noch ein wenig verbessert 
werden.

von Stefan F. (sfrings)


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.

von Joerg W. (joergwolfram)


Lesenswert?

Hallo Stefan,

ich habe das bei meinen Scripten so gelöst:
1
if($byte_wert == 0)
2
{
3
   print DFILE "0x00";
4
}
5
else
6
{
7
   printf DFILE "%#2.2x",$byte_wert;
8
}

Jörg

von bitte löschen (Gast)


Lesenswert?

Es geht auch mit einer Kommandozeile:
1
sed -e"s/\"/\\\\\"/g" -es/^/\"/ -e"s/$/\\\\r\\\\n\"/" < fuh.html > blah.inc

von Stefan F. (sfrings)


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

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.