Erste Bytes einer Datei ändern



  • Hallo.
    Ich habe auf einem ein paar Dateien, die mehrere GB groß sind. Das einzige Problem ist, dass sie einen kleinen Schönheitsfehler haben: Am Anfang - also wenn ich es im Hex-Editor lese - sind die ersten beiden Zahlen 00. Sie müssten aber korrekterweise 9A sein.
    Wenn ich nun bei einigen Dateien im Hex-Editor das abändere und die Datei speichere, dauert das SEEEEEEEEEEEEEHR lange, weil die ganze Datei kopiert würde. Gibt es eine Möglichkeit, nur diese ersten beiden Zahlen zu ändern?
    😞



  • hmm keine ahnung aber vielleicht helfen memory mapped files weiter? Bei mehreren gb wohl allerdings nur unter 64 bit OSsen...



  • Schau doch einfach mal wie lange es dauert, wenn du die Datei einfach mit einem C++-Filestream öffnest, den ersten Byte abänderst und speicherst.



  • Sind die Zahlen binär abgelegt oder im ASCII/Unicode-Format?



  • Icematix schrieb:

    Sind die Zahlen binär abgelegt oder im ASCII/Unicode-Format?

    Die sind binär gespeichert.



  • So:

    std::ofstream file("file.txt");
    file.seekp(0, std::ios_base::beg);
    file.put(9);
    file.put(4);
    file.close();
    


  • #include "stdafx.h"
    #include <tchar.h>
    #include <windows.h>
    #include <iostream>
    
    ///////////////////////////////////////////////////////////////////////////////
    
    void reportError(const wchar_t* functionName, int errorCode)
    {
        std::wcerr << L"\'" << functionName << L"\' has failed with error code " << errorCode << std::endl;
    }
    
    int _tmain(int argc, TCHAR* argv[])
    {
        if (2 != argc)
        {
            std::wcerr << L"Syntax: myapp <file>" << std::endl;
            return EXIT_FAILURE;
        }
    
        HANDLE file = CreateFile(argv[1], 
                                 GENERIC_READ | GENERIC_WRITE, 
                                 FILE_SHARE_READ | FILE_SHARE_WRITE, 
                                 NULL, 
                                 OPEN_EXISTING, 
                                 FILE_ATTRIBUTE_NORMAL, 
                                 NULL);
    
        if (INVALID_HANDLE_VALUE == file)
        {
            reportError(L"CreateFile(..)", GetLastError());
            return EXIT_FAILURE;
        }
    
        unsigned char buffer[] = { 0x01, 0x02, 0x03, 0x04 };
        DWORD numberOfBytes = sizeof(buffer) / sizeof(buffer[0]);
        DWORD numberOfBytesWritten = 0;
        BOOL result = WriteFile(file, buffer, numberOfBytes, &numberOfBytesWritten, NULL);
        if (FALSE == result)
        {
            reportError(L"WriteFile(..)", GetLastError());
        }
    
        CloseHandle(file);
    }
    

Anmelden zum Antworten