Was ist der richtige Weg, um die Ausgabe der hex-Daten in eine Datei?
Hab ich überlesen [ostream] << hex << 0x[hex value]
, aber ich habe einige Fragen dazu,
(1) ich mein Datei-stream, die output
zu sein, eine hex-Ausgabe-stream-Datei, mit output.open("BWhite.bmp",ios::binary);
, denn ich wusste, dass, macht das das hex
parameter in der output<<
operation überflüssig?
(2)
Wenn ich einen integer-Wert wollte ich auf speichern in der Datei, und ich habe diese:
int i = 0;
output << i;
ich würde gespeichert werden in little-endian oder big-endian? Wird die endi-ness ändern, basierend auf dem computer das Programm ausgeführt oder kompiliert?
Ist die Größe dieses Wertes hängt von dem computer, mit dem es ausgeführt? Würde ich die hex-parameter?
(3) gibt es eine Möglichkeit, um die rohen hex-Ziffern in einer Datei? Wenn ich die Datei mit dem hex-Ziffer 43, was soll ich verwenden?
output << 0x43
und output << hex << 0x43
beide Ausgabe ASCII 4 ASCII 3.
Zweck der Ausgabe dieser hex-Ziffern ist, um die header für eine .bmp-Datei.
- Die endian Typ hat in der Tat davon abhängen, auf welcher Plattform Sie führen das Programm auf. Und so ist die Größe von int.
- nicht
output << 0x43
Ausgabe "67"? - Aber der Ausdruck
output < i
ist nicht betroffen von endian Typ als Ausgabe nur text ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die formatierte Ausgabe Betreiber
<<
für nur: formatierte Ausgabe. Es ist für strings.Als solche, die
std::hex
stream manipulator erzählt streams zur Ausgabe von zahlen als Zeichenfolgen formatiert als hex.Wenn Sie wollen, um die rohen Binär-Daten verwenden Sie die unformatierte Ausgabe-Funktionen nur, z.B.
basic_ostream::put
undbasic_ostream::write
.Könnte man die Ausgabe einer int-so:
Die endianness der Ausgabe hängt von der Architektur. Wenn Sie möchten mehr Kontrolle haben, empfehle ich die folgenden:
In diesem Beispiel wird die Ausgabe einer 32-bit-integer als little-endian-unabhängig von der endianness der Plattform. Seien Sie vorsichtig, der Umwandlung zurück, wenn
char
unterzeichnet ist, obwohl.0x01f7
mitoutput.write(reinterpret_cast< char* >(&n), sizeof(n));
enthält die Datei0xf701
Sagen Sie
"Raw hex-Ziffern" hängt von der interpretation, die Sie auf eine Sammlung von bits. Betrachten Sie das folgende:
Alle oben stellt den gleichen numerischen Menge, aber wir interpretieren es anders.
So können Sie einfach brauchen, um die Daten zu speichern als Binär-format, das ist die exakte bit-Muster, das ist repräsentiert durch die Anzahl.
EDIT1
Beim öffnen einer Datei im text-Modus und schreiben Sie eine Zahl, sagen, wenn Sie schreiben
74
(wie im obigen Beispiel) wird es gespeichert als zwei ASCII-Zeichen'7'
und'4'
. Um dies zu vermeiden öffnen Sie die Datei im binary-Modusios::binary
und schreiben Sie es mitwrite ()
. Überprüfen Sie http://courses.cs.vt.edu/~cs2604/fall00/binio.html#schreibenScheinen Sie eine große Missverständnis, wie Dateien arbeiten.
Den stream-Operatoren
<<
generieren text (human readable output). Die .bmp-Datei-format ist ein binäres format, das nicht lesbar ist (wird es aber nicht schön und ich würde es nicht Lesen, ohne Werkzeuge).Was Sie wirklich wollen, zu tun, ist erzeugen die binäre Ausgabe und legen Sie die Datei:
Dies schreibt ein byte an Daten mit dem hex-Wert 0x43, um den Ausgabe-stream. Dies ist die binäre Darstellung, die Sie wollen.
Weder; Sie sind wieder text ausgegeben (nicht binäre Daten).
Hier brauchen Sie Sie nicht zu kümmern endian Typ (und Größe) der integer-Wert und dies wird variieren, abhängig von der hardware, auf der Sie Ihre Anwendung ausführen auf. Für den Wert 0 gibt es nicht viel schleppen sorgen endian Typ, aber Sie sollten sich sorgen über die Größe der Ganzzahl.
Ich würde stick etwas geltend macht in meinen code zu validieren, die Architektur ist OK, für den code. Dann lassen Sie die Menschen über sorgen, wenn Ihre Architektur nicht mit den Anforderungen übereinstimmen:
Es ist eine Familie von Funktionen, die Ihnen helfen, mit den endian Typ und Größe.
http://www.gnu.org/s/hello/manual/libc/Byte-Order.html
Letzte Sache. Beim öffnen einer Datei im binary-format
output.open("BWhite.bmp",ios::binary)
es tut nichts, um stream-abgesehen von, wie es behandelt dieend of line sequence
. Wenn die Datei im binären format der Ausgabe nicht verändert (was man im stream ist das, was in die Datei geschrieben). Wenn Sie verlassen der stream im text-Modus dann '\n' - Zeichen konvertiert, um die end-of-line-Sequenz (OS-spezifischen Satz von Zeichen definieren, dass das Ende der Zeile). Da Sie schreiben eine binäre Datei, die Sie definitiv nicht wollen, dass jede Einmischung in die Zeichen, die Sie schreiben, so ist binary das richtige format. Aber es hat keinen Einfluss auf andere operation, die Sie durchführen auf dem stream.operator <<
war so falsch, dass es nicht relevant ist, wie die Ausgabe ist text.Here you do not need to worry about endianess (and size) of the integer value...
. Das ist es, was ich mich beziehe. Sagen Sie, dass ich nur don ' T haben, um über sorgen endian Typ, wenn der Wert gleich null ist?assert(sizeof(int) == 4);
Sie in die code-dies wird sicherstellen, dass es nicht funktioniert, wenn Sie die Portierung auf eine neue Plattform, wo diese Bedingung bricht. Die Größe des .bmp-Datei, ich bin sicher befestigt ist, um eine sehr spezifische Größe.output.write(&i, sizeof(i));
für eine ganze Zahl i, ich bekomme eine Fehlermeldung vom compiler, um zu versuchen, verwenden Sie eineint*
an die Stelle einerchar*
.int test = 0x12345678;assert(((char*)&test)[0] == 0x78);