Struct alignment
Verfasst: 12.12.2012, 11:02
Servus,
ich schreibe gerade einen Parser für das Zip Dateiformat, funktioniert soweit auch super, dennoch werd ich bezüglich des struct alignments wahnsinnig. Gestern dachte ich ich hätte das Problem durch __declspec(align(1)) in den Griff bekommen, heute bekomme ich schon wieder Probleme:
Defacto werden mir dann Bytes so verschoben, dass der Wert aus fileNameLength 0 wird und uncompressedSize einen magischen Wert bekommt. Kann mir bitte mal jemand erklären warum mir der Compiler das Layout verändert? (Ich hoffe ja mal nicht das es an der VS2012 Nov CTP liegt)
Mit freundlichem Gruß
RazorX
ich schreibe gerade einen Parser für das Zip Dateiformat, funktioniert soweit auch super, dennoch werd ich bezüglich des struct alignments wahnsinnig. Gestern dachte ich ich hätte das Problem durch __declspec(align(1)) in den Griff bekommen, heute bekomme ich schon wieder Probleme:
Code: Alles auswählen
namespace zip {
struct __declspec(align(1)) local_file_header {
FATE_UTIL_API static const int32_t SIGNATURE;
int32_t signature;
int16_t minVersion;
int16_t generalPurpose;
int16_t compressionMode;
int16_t fileLastModificationTime;
int16_t fileLastModificationDate;
int32_t crc32;
int32_t compressedSize;
int32_t uncompressedSize;
int16_t fileNameLength;
int16_t extraFieldLength;
std::string fileName;
std::string extraField;
};
};
// ...
archiveStream->seekg(localOffset, std::istream::beg);
archiveStream->read(reinterpret_cast<char*>(&fileInfo.localHeader.signature), 4);
if(fileInfo.localHeader.signature != zip::local_file_header::SIGNATURE) {
throw std::ios_base::failure("...");
}
// Funktioniert
archiveStream->read(reinterpret_cast<char*>(&fileInfo.localHeader.minVersion), 10);
archiveStream->read(reinterpret_cast<char*>(&fileInfo.localHeader.crc32), 12);
archiveStream->read(reinterpret_cast<char*>(&fileInfo.localHeader.fileNameLength), 4);
// Funktioniert nicht
archiveStream->read(reinterpret_cast<char*>(&fileInfo.localHeader.minVersion), 26);
Mit freundlichem Gruß
RazorX