C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

struct in char string umformen?

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Felix Kater
Guest





PostPosted: Wed Sep 15, 2004 7:49 am    Post subject: struct in char string umformen? Reply with quote



Hallo,

zum Erzeugen von Bitmap-Grafikdateien, muss ich als erstes bestimmte
Daten als Header in die Datei schreiben.

Ich habe ein entsprechendes struct, das alle diese Daten als
Member-Variablen (z.T. Byte, mal DWord etc.) enthält, und setze sie auf
die entsprechenden Werte.

Jetzt würde ich aber diese Daten gerne in einen char string umformen, da
ich sie so am besten als Datei ausgeben kann. Wie macht man das?

Felix

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Markus Schaaf
Guest





PostPosted: Wed Sep 15, 2004 8:09 am    Post subject: Re: struct in char string umformen? Reply with quote



"Felix Kater" <f.kater2 (AT) gmx (DOT) net> schrieb:

Quote:
zum Erzeugen von Bitmap-Grafikdateien, muss ich als erstes bestimmte
Daten als Header in die Datei schreiben.

Ich habe ein entsprechendes struct, das alle diese Daten als
Member-Variablen (z.T. Byte, mal DWord etc.) enthält, und setze sie auf
die entsprechenden Werte.

Jetzt würde ich aber diese Daten gerne in einen char string umformen, da
ich sie so am besten als Datei ausgeben kann. Wie macht man das?

Gar nicht. Wenn Du den Weg über eine POD-Struct gehen willst (das ist
nicht sehr portabel), castet Du einfach Zeiger:

void write_bitmap()
{
struct bitmap_header {
...
} bmh;

cout.write( (char*) (void*) &bmh,
sizeof bmh );
}

Besser wäre es, die Daten wirklich byteweise zu schreiben.

MfG

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Steffen Rauh
Guest





PostPosted: Wed Sep 15, 2004 8:16 am    Post subject: Re: struct in char string umformen? Reply with quote



Quote:
zum Erzeugen von Bitmap-Grafikdateien, muss ich als erstes bestimmte
Daten als Header in die Datei schreiben.
Ich habe ein entsprechendes struct, das alle diese Daten als
Member-Variablen (z.T. Byte, mal DWord etc.) enthält, und setze sie auf
die entsprechenden Werte.
Jetzt würde ich aber diese Daten gerne in einen char string umformen, da
ich sie so am besten als Datei ausgeben kann. Wie macht man das?

Indem du dir einen Datenpuffer erzeugst und die Werte dort rein kopierst
(solltest vorher natürlich noch sicherstellen, dass die Datenreihenfolge
stimmt - Stichwort big und little Endian):

struct Header
{
char Byte;
short Word;
int DWord;
}

Header MyHeader;
char* Buffer = new char[1024];
char* OrigBuffer = Buffer;

memcpy(Buffer, &MyHeader.Byte, sizeof(char));
Buffer += sizeof(char);

memcpy(Buffer, &MyHeader.Word, sizeof(short));
Buffer += sizeof(short);

memcpy(Buffer, &MyHeader.DWord, sizeof(int));
Buffer += sizeof(int);

Auf keinen Fall darfst du die gesamte Struktur so kopieren:
// FALSCH
memcpy(Buffer, &MyHeader, sizeof(MyHeader));
Buffer += sizeof(MyHeader);

Denn in der Struct können Füllbytes stehen (systemabhängig), die dir dann
deinen Header zerstören.
Natürlich nicht vergessen, den Puffer auch wieder freizugeben.

MfG,
Steffen Rauh

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Mike Podonyi
Guest





PostPosted: Wed Sep 15, 2004 10:57 am    Post subject: Re: struct in char string umformen? Reply with quote

Quote:

Denn in der Struct können Füllbytes stehen (systemabhängig), die dir dann
deinen Header zerstören.
Natürlich nicht vergessen, den Puffer auch wieder freizugeben.


Kann man mit der VisualC++ Compiler Option:
/Zp[1|2|4|8|16]oder #pragma packsteuern.Bye

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Hendrik Sattler
Guest





PostPosted: Wed Sep 15, 2004 1:51 pm    Post subject: Re: struct in char string umformen? Reply with quote

Mike Podonyi wrote:

Quote:

Denn in der Struct können Füllbytes stehen (systemabhängig), die dir dann
deinen Header zerstören.
Natürlich nicht vergessen, den Puffer auch wieder freizugeben.


Kann man mit der VisualC++ Compiler Option:
/Zp[1|2|4|8|16]oder #pragma packsteuern.Bye

Und warum sollte man? Bei einem anderen Compiler hat man ja dann schon
wieder das Problem.

HS

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Spiro Trikaliotis
Guest





PostPosted: Thu Sep 16, 2004 7:07 am    Post subject: Re: struct in char string umformen? Reply with quote

Hallo,

Hendrik Sattler <sattler2000 (AT) gmx (DOT) de> schrieb:
Quote:

Kann man mit der VisualC++ Compiler Option:
/Zp[1|2|4|8|16]oder #pragma packsteuern.Bye

Und warum sollte man? Bei einem anderen Compiler hat man ja dann schon
wieder das Problem.

Da fällt mir ein: Im MS DDK gibt es die include-Dateien packon.h und
packoff.h. packon.h schaltet das Padding aus, packoff.h wieder ein.

Die Implementierung ist dann natürlich compiler-spezifisch, allerdings
kann man so compiler-unabhängig schreiben, sofern die Compiler das
unterstützen.

Gibt es irgend etwas vergleichbares, welches im Standard festgeschrieben
ist? Ich befürchte ja, dass die Antwort "nein" lautet, aber ich will
zumindest mal gefragt haben. ;-)

Gruß,
Spiro.
--
Spiro R. Trikaliotis
http://www.trikaliotis.net/
http://www.viceteam.org/

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Stefan Reuther
Guest





PostPosted: Thu Sep 16, 2004 5:28 pm    Post subject: Re: struct in char string umformen? Reply with quote

Spiro Trikaliotis wrote:
Quote:
[#pragma pack & Freunde]
Gibt es irgend etwas vergleichbares, welches im Standard festgeschrieben
ist? Ich befürchte ja, dass die Antwort "nein" lautet, aber ich will
zumindest mal gefragt haben. Wink

Nein, sowas gibt es nicht und kann es nicht geben.

x86 dürfte die einzige in Stückzahlen verbleibende Architektur sein, auf
der man unaligned zugreifen kann, sprich, bei denen man
struct X {
char c;
long l;
};
auf 5 Bytes eindampfen kann. Auf allen anderen mir bekannten
Architekturen sind falsch ausgerichtete Speicherzugriffe verboten. Ein
4-Byte-long muss also auf einer durch 4 teilbaren Adresse liegen.
Verletzt man diese Regel, gibt es z.B. SIGBUS o.ä. Der Compiler würde
also Code erzeugen, der schlicht nicht funktioniert. Und alle
Wort-Zugriffe in Bytes zerlegen ist keine Option.

Niemand hindert dich natürlich daran, deine eigenen Versionen von
packon.h und packoff.h zu schreiben. Damit schränkst du aber automatisch
die Portabilität deines Programmes ein. #pragma pack ist meiner Meinung
nach unnütz. Zumal es bei dem anderen wichtigen Strukturlayout-
Kompatibilitätsproblem, nämlich Big-Endian vs. Little-Endian vs.
Middle-Endian, gar nicht hilft.


Stefan

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Thomas Dorner
Guest





PostPosted: Thu Sep 16, 2004 6:44 pm    Post subject: Re: struct in char string umformen? Reply with quote

Hallo Stefan!

SR>x86 dürfte die einzige in Stückzahlen verbleibende Architektur sein, auf
SR>der man unaligned zugreifen kann, sprich, bei denen man
SR> struct X {
SR> char c;
SR> long l;
SR> };
SR>auf 5 Bytes eindampfen kann. Auf allen anderen mir bekannten
SR>Architekturen sind falsch ausgerichtete Speicherzugriffe verboten.

Alle mir bekannten Mainframes (z.B. 390er Architektur) haben damit
kein Problem (außer etwas schlechter Performance beim Zugriff auf l).
Man kann natürlich diskutieren, daß die Anzahl Mainframe-Rechner
deutlich kleiner ist als die Anzahl PCs, aber trotzdem ... ;-)

Viele Grüße, Thomas
--
From-Adresse wird nicht genutzt, Reply-To Adresse gilt nur 4 Wochen!

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Spiro Trikaliotis
Guest





PostPosted: Fri Sep 17, 2004 1:19 pm    Post subject: Re: struct in char string umformen? Reply with quote

Hallo Stefan,

Stefan Reuther <stefan.news (AT) arcor (DOT) de> schrieb:

Quote:
Der Compiler würde also Code erzeugen, der schlicht nicht
funktioniert. Und alle Wort-Zugriffe in Bytes zerlegen ist keine
Option.

Nun ja. Beim Zugriff auf Hardware ist man leider manchmal irgendwie
gezwungen, solche Zugriffe zu machen. Das dürfte auch der Grund sein,
wieso das DDK - bei dem es ja gerade um die Programmierung von Treibern,
also Hardware geht - diese Header mitbringt.

Quote:
#pragma pack ist meiner Meinung nach unnütz. Zumal es bei dem anderen
wichtigen Strukturlayout- Kompatibilitätsproblem, nämlich Big-Endian
vs. Little-Endian vs. Middle-Endian, gar nicht hilft.

Hm... Gibt es eine Maschine, die Middle-Endian ist? Das fände ich sehr
interessant. :-)

Gruß,
Spiro.
--
Spiro R. Trikaliotis
http://www.trikaliotis.net/
http://www.viceteam.org/

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Stefan Reuther
Guest





PostPosted: Fri Sep 17, 2004 6:06 pm    Post subject: Re: struct in char string umformen? Reply with quote

Spiro Trikaliotis wrote:
Quote:
Stefan Reuther <stefan.news (AT) arcor (DOT) de> schrieb:
Der Compiler würde also Code erzeugen, der schlicht nicht
funktioniert. Und alle Wort-Zugriffe in Bytes zerlegen ist keine
Option.

Nun ja. Beim Zugriff auf Hardware ist man leider manchmal irgendwie
gezwungen, solche Zugriffe zu machen. Das dürfte auch der Grund sein,
wieso das DDK - bei dem es ja gerade um die Programmierung von Treibern,
also Hardware geht - diese Header mitbringt.

Hardware an sich kann eh normalerweise keine nicht-ausgerichteten
Zugriffe, das wird dann vom Prozessor geradegebogen, und auf dem Bus
landen wieder nur ausgerichtete Adressen.

#pragma pack braucht man meiner Meinung nach nur zum bequemen Lesen von
Datenstrukturen, die vor Urzeiten mal jemand mit krummen Offsets gebaut
hat. Allerdings finde ich, dass einen das bisschen Marshalling auf einem
3-GHz-Prozessor nicht umbringt.

Allerdings ist hardwarenahe Programmierung einer der wenigen Bereiche,
wo ich großzügigen Einsatz von #pragmas aller Art noch dulde Smile Da wird
es eh hochgradisch implementationsspezifisch.

Quote:
#pragma pack ist meiner Meinung nach unnütz. Zumal es bei dem anderen
wichtigen Strukturlayout- Kompatibilitätsproblem, nämlich Big-Endian
vs. Little-Endian vs. Middle-Endian, gar nicht hilft.

Hm... Gibt es eine Maschine, die Middle-Endian ist? Das fände ich sehr
interessant. Smile

IIRC war das die PDP-11, hab so ein Ding aber nie live gesehen.


Stefan

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Mon Sep 20, 2004 1:30 pm    Post subject: Re: struct in char string umformen? Reply with quote

Spiro Trikaliotis <news+200406 (AT) trikaliotis (DOT) net> wrote


Quote:
Hm... Gibt es eine Maschine, die Middle-Endian ist? Das fände ich sehr
interessant. Smile

Richtige Middle-Endian glaube ich nicht. Das wäre 1342, oder so was
ähnlich. Dagegen habe ich wohl Systeme erlebt, wo die Reihenfolge der
Bytes in einem long war 3412. Intel 8086, z.B. (mindestens mit dem
MicroSoft Compiler).

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.