Richtiges Daten handling mit .Net



  • Hallo!

    Ich möchte gerne binäre Dateien bearbeiten und nicht viel Zeit in eine GUI stecken. Deshalb viel meine Wahl auf C++/CLI.

    Das binäre Dateiformat ist in C++ .h dokumentiert: Header, Header2, Data, Import, Export
    Header:

    class fHeader {
    DWORD Id1;
    DWORD Id2;
    DWORD Id iSig;
    DWORD iCrc;
    DWORD iCompression;
    DWORD iFlags;
    LWORD iDataSize;
    DWORD iImportSize;
    DWORD iExportSize;
    }
    

    Dazu meine Klasse um mal den Header zu lesen:

    MBinaryFile::MBinaryFile(String^ name)
    {
    	this->FileName = name;
    
    	OriginalFileHeader = gcnew array<Byte>(sizeof(fHeader));
    
    	FileStream^ fs = gcnew FileStream(this->FileName, FileMode::Open, FileAccess::Read);
    
    	BinaryReader^ br = gcnew BinaryReader(fs);
    	OriginalFileHeader = br->ReadBytes(OriginalFileHeader->Length);
    
    	//convert it to C++
    	pin_ptr<Byte> pHeader = &OriginalFileHeader[0];
    	fHeader* iOrigHdr = reinterpret_cast<fHeader*>(pHeader);
    
    	//read other sections...
    	Data = gcnew array<Byte>(iOrigHdr->iDataSize);
    	Data = br->ReadBytes(Data->Length);
    }
    

    Das Problem dabei ist, dass immer wenn man auf die Headermember zugreifen will muss der pin_ptr benutzt werden. Dieser kann ja nicht Klassenmember sein.
    http://msdn.microsoft.com/en-us/library/1dz8byfh(VS.80).aspx

    MBinaryFile::ChangeFlags(DWORD newFlags)
    {
    	//convert it to C++
    	pin_ptr<Byte> pHeader = &OriginalFileHeader[0];
    	fHeader* iOrigHdr = reinterpret_cast<fHeader*>(pHeader);
    
    	iOrigHdr->iFlags = newFlags;
    
    }
    

    Den Header in eine .Net Klasse packen würde ja nicht so viel Arbeit sein. Aber da ist noch Header2. Und der ist viel größer und hat eine Menge inline Funktionen. Deshalb würde ich mir das gerne ersparen.

    Ist pin_ptr nun die beste Lösung um mit den Headermembern umzugehen? Oder gibt's was einfacheres?

    Vielen Dank für die Hilfe!



  • Ob's was einfacheres gibt kann ich dir grad auch ned sagen, aber ich frag mich grad, ob es eine so gute Idee ist, ein Array von Bytes per cast auf eine Klasse umzubiegen da der Compiler Füllbytes zwischen zwei Member einfügen kann. Könnte hier zwar gut gehen, da es wohl immer 4 Byte Datentypen sind, aber wenn sich z. B. mal ein Byte dazwischenmogelt (oder für 64 Bit übersetzt wird?) sollte zumindest sichergestellt sein, dass das "struct member alignment" auf 1 steht (hab mir wegen sowas schon mal einen Wolf gesucht). Nur so als Hinweis am Rande.


Log in to reply