Forum: Mikrocontroller und Digitale Elektronik html in c umwandeln


von Robert B. (rsb89)


Lesenswert?

Hallo zusammen,

ich möchte gerne einen einfachen webserver auf einem LPC1768 realiseren. 
Der LwIP-Stack läuft mitlerweile und eine "fertige" Seite auch schon. 
Habe jetzt aber eine eigene kleine Seite in html geschrieben und die 
muss ja jetzt, wenn ich es richtig verstanden habe in dieses fsdata.c . 
Da steht dann alles in hexadezimal. Aber womit kann ich das machen??? 
ich habe zwar einen ordner wo eine makefsdata.c drin ist aber wie wende 
ich diese an? (einfach kompilieren und los geht leider nicht) Gibt es 
für sowas Tools?

von Karl H. (kbuchegg)


Lesenswert?

R. B. schrieb:
> Hallo zusammen,
>
> ich möchte gerne einen einfachen webserver auf einem LPC1768 realiseren.
> Der LwIP-Stack läuft mitlerweile und eine "fertige" Seite auch schon.
> Habe jetzt aber eine eigene kleine Seite in html geschrieben und die
> muss ja jetzt, wenn ich es richtig verstanden habe in dieses fsdata.c .
> Da steht dann alles in hexadezimal.

Nö.
Im C-File schreibst du das so rein, wie es dir am besten passt. Und bei 
Text ist das ... tada ... Text. Und nicht die ASCII Codes des Textes als 
Hex-Ziffern.
1
char Seite[] = {
2
  "<html>\n"
3
  "<body>\n"
4
  "   Juhu\n"
5
  "</body>\n"
6
  "</html>\n"
7
};

ist perfektes C. Und sich ein C-Programm auf dem PC zu schreiben, 
welches ein HTML File Zeile für Zeile ausliest und mit den 
entsprechenden Ergänzungen versieht, damit es als include in ein anderes 
C-File taugt, ist nun wirklich trivial und eine Anfängerübung für 
Filebehandlung in C.

Im Endeffekt kommt das dann sinnvollerweise so hin

fsdata.c
**********
1
....
2
char Seite[] = {
3
#include "htmlCode.inc"
4
};
5
...


htmlCode.inc
************
1
  "<html>\n"
2
  "<body>\n"
3
  "   Juhu\n"
4
  "</body>\n"
5
  "</html>\n"

Damit kann man dann den HTML Code mittels Tool leicht ändern bzw. 
erzeugen lassen, ohne ständig im eigentlichen C-File rumfuhrwerken zu 
müssen. Dem #include ist es ja egal, welches File er da reinzieht. Das 
angegebene File wird an der Stelle, an der der #include steht einfach 
eingesetzt. Und erst danach muss sich daraus dann gültiger C-Code 
ergeben.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> ist nun wirklich trivial und eine Anfängerübung für
> Filebehandlung in C.

Ganz so trivial ist das auch nicht, da HTML u.A. Attribute mit " 
versieht und auch der "Text" ggf. Sonderzeichen erlaubt, welche in 
"normalem" C-Strings nicht ganz erlaubt sind, bei UTF-8/Unicode/... und 
sonstigen encodings wird es dann ggf. richtig hässlich.
Ein Umwandeln in "hex" ist da sehr viel Stressfreier solange man 
wirklich nur den reinen Bytestream rausgeben will.

von Karl H. (kbuchegg)


Lesenswert?

Läubi .. schrieb:
> Karl Heinz Buchegger schrieb:
>> ist nun wirklich trivial und eine Anfängerübung für
>> Filebehandlung in C.
>
> Ganz so trivial ist das auch nicht, da HTML u.A. Attribute mit "
> versieht und auch der "Text" ggf. Sonderzeichen erlaubt, welche in
> "normalem" C-Strings nicht ganz erlaubt sind, bei UTF-8/Unicode/... und
> sonstigen encodings wird es dann ggf. richtig hässlich.

Jau. Ist aber alles letzten Endes nur Textersetzung. Anstatt eines " ein 
\" auszugeben, ist nicht wirklich wild. Und den Rest sollte ja 
eigentlich der HTML Code bereits korrekt aufgelöst haben (Umlaute 
u.dgl.)

> Ein Umwandeln in "hex" ist da sehr viel Stressfreier solange man
> wirklich nur den reinen Bytestream rausgeben will.

... und ... wenn man es kann :-)

von Robert B. (rsb89)


Lesenswert?

Läubi .. schrieb:
> Ein Umwandeln in "hex" ist da sehr viel Stressfreier

Und wie mach ich das dann? ;)

@kbuchegg: danke schonmal, ist sicherlich eine gute alternative. wusste 
nur nicht dass es so geht

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Und den Rest sollte ja
> eigentlich der HTML Code bereits korrekt aufgelöst haben

Keine Ahnung wie ein C-Compiler mit UTF-8 klarkommt, und es sind halt 
die Kleinigkeiten welche es schwer machen, ich könnte in HTML schreiben
1
<div myAttr="\" />
 und schon gibts blöde Kompilierfehler...

Karl Heinz Buchegger schrieb:
> ... und ... wenn man es kann :-)

Naja die Bytes in Hex zu wandeln sind dann auch nicht mehr soooo schwer. 
Wenn es nun zu arg stört kann man immer noch den Linker nutzen die 
Binärdaten direkt einzubinden ;-)

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Wenn es dir nur ums umwandeln geht such doch mal nach bin2c da gibt es 
genug Tools.

von Karl H. (kbuchegg)


Lesenswert?

Läubi .. schrieb:
> Karl Heinz Buchegger schrieb:
>> Und den Rest sollte ja
>> eigentlich der HTML Code bereits korrekt aufgelöst haben
>
> Keine Ahnung wie ein C-Compiler mit UTF-8 klarkommt, und es sind halt
> die Kleinigkeiten welche es schwer machen, ich könnte in HTML
> schreiben
1
<div myAttr="\" />
 und schon gibts blöde
> Kompilierfehler...

OK. Backslash muss man noch ersetzen
1
char code[] = {
2
"<div myAttr=\"\\\" />"
3
};


> Naja die Bytes in Hex zu wandeln sind dann auch nicht mehr soooo schwer.

Für den TO offenbar aber schon :-)
(Ich würds aber trotzdem nicht machen. Text ist einfacher zu warten, 
wenns mal Probleme gibt)

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ich würds aber trotzdem nicht machen
Bleibt noch das Problem mit Multibyte Zeichen...
>Text ist einfacher zu warten
Man sollte hoffentlich doch wohl immer nur die Quelle ändern und nicht 
das "Kompilat".

von Karl H. (kbuchegg)


Lesenswert?

Wenn ich mirs recht überlege, muss man das noch nicht mal zeilenweise 
lesen. Das kann man Buchstabe für Buchstabe einlesen, den Buchstaben je 
nachdem  aufbereiten und aufs Include File schreiben.

Alles in allem nicht wirklich wild. Wer das Kapitel Filebhandlung in 
seinem K&R durch hat, sollte da eigentlich keinerlei Schwierigkeiten 
haben.

von Karl H. (kbuchegg)


Lesenswert?

Läubi .. schrieb:
> Karl Heinz Buchegger schrieb:
>> Ich würds aber trotzdem nicht machen
> Bleibt noch das Problem mit Multibyte Zeichen...

Wie sieht das im HTML Code aus?

von Karl H. (kbuchegg)


Lesenswert?

Du hast schon recht, wenn man das mit allem PipaPo macht, dann ist da 
schon etwas an Arbeit notwendig.
Die Frage ist allerdings: braucht er das wirklich?
Oder kommt er mit dem durch, was sich mittels normalem ASCII-Html alles 
machen lässt.
In dem Fall ist das einfach nur ein wenig Text-Aufbereitung, so dass man 
es als String durch den C-Compiler bringt.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Läubi .. schrieb:
>> Karl Heinz Buchegger schrieb:
>>> Ich würds aber trotzdem nicht machen
>> Bleibt noch das Problem mit Multibyte Zeichen...
>
> Wie sieht das im HTML Code aus?

Die Datei ist einfach UTF-8  UTF-16  ... codiert.

Karl Heinz Buchegger schrieb:
> Oder kommt er mit dem durch, was sich mittels normalem
> ASCII-Html alles machen lässt.
Klar gehen tut das gerade das Encoding wurde ja eh jahrelang von allen 
(Browser/Server) Seiten recht "großzügig" ausgelegt. Wenn man es aber eh 
Zeichenweise ausliest ist doch eine Ausgabe als Hex nun wirklich nicht 
mehr wild...

von Marco M. (marco_m)


Lesenswert?

Falls dein Compiler GCC + GNU Binutils ist, dann kannst du die HTML 
Datei auch mit dem inline Assembler + .incbin Direktive in dein Programm 
einbetten. Hätte den Vorteil, daß man an deinem Buildprozess nichts 
drehen müsste, die Datei wird nach dem Compilieren einfach genau so wie 
sie ist beim Assemblieren eingelesen.

http://sourceware.org/binutils/docs-2.20/as/Incbin.html#Incbin

Beispiel. Wenn du dies hier als foo.c speicherst und mit gcc foo.c -o 
foo kompilierst, dann gibt ./foo den eigenen Quellcode aus.
1
#define INCLUDE_TEXT(X,F) asm (          \
2
 ".globl " #X\n"                         \
3
 "  .data\n"                             \
4
 "  .type  " #X ", @object\n"            \
5
 "   .size  " #X ", " #X "End-" #X "\n"  \
6
 #X ":\n"                                \
7
 "  .incbin \"" F "\"\n"                 \
8
 "   .byte 0,0,0,0\n"                    \
9
 #X "End:\n"                             \
10
 ); extern char X[];
11
12
INCLUDE_TEXT(SomeText,"foo.c");
13
int main()
14
{
15
  puts(SomeText);
16
}

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.