Für meine erste Frage hier, Ich möchte über das Lesen von Binärdateien in C++ sprechen; Ich rekodiere eine ID3-Tag-Bibliothek.C++, seltsames Verhalten beim Lesen binärer ifstream
Ich bin Parsen der Header, der eine binäre Datei, die ersten 10bytes sind wie folgt:
ID3 = 3 bytes = constant identifier
0xXXXX = 2 bytes = version (MSB: major version, LSB: minor. eg: 0x0301 = v3.1)
0xXX = 1 byte = some flags
4*0xXX = 4 bytes = size
hier ist das Stück Code, das zu verarbeiten:
char id[4];
uint16_t version;
uint8_t flags;
uint32_t size;
std::ifstream _stream;
_stream = std::ifstream(_filename, std::fstream::binary);
_stream.read(id, 3);
id[3] = 0;
// process id
_stream.read((char *)&version, 2);
// process version
_stream.read((char *)&flags, 1);
// process flags
_stream.read((char*)&size, 4);
// process flags
_stream.close();
funktioniert alles einwandfrei außer für Version. lässt sagen, es ist v3.0 (0x0300), der Wert in der Version ist 0x03 eingestellt, würde ich dieses Verhalten im Textmodus verstehen, da es 0x00 als Ende der Zeichenfolge betrachten würde, aber hier bin ich in Binär lesen. Und verwende numerische Formate.
Andere seltsame Sache, wenn ich es in 2 mal verarbeiten kann ich es funktioniert, zum Beispiel:
uint16_t version = 0;
char buff;
_stream.read(&buff, 1);
version = (buff << 8);
_stream.read(&buff, 1);
version |= buff;
In diesem Fall wird der Wert der Version 0x0300 ist.
Haben Sie eine Idee, warum die erste Methode nicht richtig funktioniert? Mache ich etwas falsch?
Sowieso Dank für Ihre Hilfe,
Prost!
mit: "Little-Endian" und „big Endian ". –
Zuerst müssen Sie genau Ihr Dateiformat definieren (vielleicht in der EBNF-Notation). –
Wenn Sie nach plattformunabhängigem Code suchen, gibt es keine Garantie, dass ein Byte 8 Bit ist (die gleichen Plattformen wie das Case würde wahrscheinlich auch keine Integer-Typen mit fester Breite unterstützen. – AndyG