Announcement

Collapse
No announcement yet.

Datei binär einlesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Datei binär einlesen

    Hallo an alle,
    ich bin kein C++ Programmierer, aber ich muss ein solches Projekt supporten. Und das auch noch in MFC.
    Ich habe folgendes Problem:
    Ich muss eine Datei binär einlesen und dann in 2 gleichgroße Buffer aufteilen. Eigentlich kein Problem, dachte ich. Aber ich bekomme
    die Datei einfach nicht eingelesen.

    code:

    CFile* pFile = NULL;
    // Constructing a CFile object with this override may throw
    // a CFile exception, and won't throw any other exceptions.
    // Calling CString::Format() may throw a CMemoryException,
    // so we have a catch block for such exceptions, too. Any
    // other exception types this function throws will be
    // routed to the calling function.
    TCHAR* pszFileName = _T("C:\\Projekte\\TestC++\\Debug\\test.bin");
    try
    {
    pFile = new CFile(pszFileName,CFile::modeRead | CFile::typeBinary);
    ULONGLONG dwLength = pFile->GetLength();
    CString str;
    str.Format(_T("Your file %S is %I64u bytes long."), pszFileName, dwLength);
    AfxMessageBox(str);
    }
    catch (CFileException* pEx)
    {
    // Simply show an error message to the user.
    pEx->ReportError();
    pEx->Delete();
    }
    catch (CMemoryException* pEx)
    {
    pEx->ReportError();
    pEx->Delete();
    // We can't recover from this memory exception, so we'll
    // just terminate the app without any cleanup. Normally,
    // an application should do everything it possibly can to
    // clean up properly and _not_ call AfxAbort().
    AfxAbort();
    }

    // If an exception occurs in the CFile constructor,
    // the language will free the memory allocated by new
    // and will not complete the assignment to pFile.
    // Thus, our clean-up code needs to test for NULL.
    if (pFile != NULL)
    {
    pFile->Close();
    delete pFile;
    }

    Die Datei ist zwar geöffnet aber die Größe ist immer 0.


    Was mach ich falsch???

    Leider darf ich die Testdatei nicht uploaden. Es handelt sich um ein binäres IDTag.

    Danke Torsten

  • #2
    Vielleicht richtig kopieren

    https://docs.microsoft.com/en-us/cpp...2019#getlength

    str.Format(_T("Your SYSTEM.INI file is %I64u bytes long."), dwLength);
    Christian

    Comment


    • #3
      Danke Christian,
      das ist aber nicht der Fehler. Das ist schon richtig.
      ULONGLONG dwLength = pFile->GetLength(); == 0!!!!
      Obwohl die Datei geöffnet ist und einen Inhalt von 256 Bytes hat.


      Comment


      • #4
        Ich habe diesselbe Datei auch als Hex. Diese wird richtig eingelesen. Aber ich will mir das umwandeln ersparen wegen evtl. Fehler.

        Comment


        • #5
          Versuch es doch mal mit einer anderen Datei außerhalb deines Projektes.
          Ansonsten würde ich keinen Fehler sehen...ist aber auch zu lange her....

          EDIT
          Ich habe diesselbe Datei auch als Hex
          Es gibt keine Datei als HEX oder ähnliches.
          Ein Datei besteht immer nur aus Bytes. Der Begriff Textdatei signalisiert nur , dass dort lesbarer Text drin ist.
          Vom Dateihandling gibt es keine Unterschiede.
          Christian

          Comment


          • #6
            Warum kann die Datei nicht mit Standard C/C++ geöffnet werden?
            http://www.cplusplus.com/reference/cstdio/fopen/
            Christian

            Comment


            • #7
              Danke habe den Fehler gefunden. Die Datei gibt es 2 mal. Davon ist eine 0 Byte gross. Und ausgerechnte die versuche ich zu laden.
              Sorry und nochmals Danke.

              Comment


              • #8
                Hallo Leute,
                ich habe jetzt irgendetwas in meinem Buffer drin stehen. Ist ja binär. Wie kann ich dass speicherbar machen. Ich muss das IDTAg bearbeiten kännen, soll heißen Teile sollen getauscht werden.

                Comment


                • #9
                  Indem du den Buffer wieder speicherst und vorher die gewünschen Speicherbereiche änderst. Mit all den Folgen:
                  - ist die Änderung gleich groß kann weggespeichert werden
                  - ist die Änderung größer/kleiner muss wohl der Buffer entsprechend geändert werden und der Speicher verschoben werden

                  IDTAg? Jetzt soll jeder wissen was damit gemeint ist?
                  Christian

                  Comment


                  • #10
                    Hey, nein das muss nicht jeder wissen. Es handelt sich um Firmware in einem Gerät und das IDTag beinhaltet einen bstimmten Teil davon und soll in die Firmware geschrieben werden. Alles binär und in MFC c++.
                    Das versteh ich gar nicht ;(

                    Comment


                    • #11
                      Befürchte, so geht das nicht.
                      Das sind ja keine unstrukturierten Daten.
                      Sie liegen in einer bestimmten Form vor
                      Beispiel
                      Du hast in C/C++ ein Struct
                      struct Person
                      {
                      char name[50];
                      int age;
                      float salary;
                      };

                      Das kannst du binär wegschreiben, in dem du ab der Adresse des struts sizeof(Person) in die Datei schreibst.
                      Dann hast du eine "binäre" Datei

                      Das bedeutet aber nicht, dass du einfach in dieser Datei jetzt den Namen oder das Alter ändern kannst. Je nach Prozessoer wird
                      ein int als Big-Endian und Little-Endian
                      https://www.computerweekly.com/de/de...-Little-Endian
                      geschrieben. Auch kann der Name nicht länger als 50 Byte werden.

                      Du müsstest in diesem Fall die Datei wieder an die Adresse der Struktur lesen, die Daten mit der Struktur ändern und dann wegschreiben.

                      Deine "Firmware"-Datei wird ja irgendwas an Struktur haben. Bsp. ist sie gepackt, verschlüsselt o.a.


                      Ein Ausnahme ist nur, wenn du genau weißt, an Stelle 3456 im Buffer ist die Zeichenfolge ABC durch JKL zu erstzen.
                      Das könnte funktionieren


                      Zu Anfang war die Rede von

                      dann in 2 gleichgroße Buffer aufteilen.
                      Das kannst du machen. Teile den Buffer durch 2 und schreibe jeweils die Bytes in eine Datei.




                      Christian

                      Comment

                      Working...
                      X