Overhead-Daten beim Schreiben in eine Binärdatei

Lesezeit: 2 Minuten

Ich möchte ein Array mit 16-Bit-Ganzzahlen als rohe Binärdatei in eine Datei schreiben und habe es mit folgendem Beispiel versucht:

#  define __int8_t_defined
__intN_t (8, __QI__);
__intN_t (16, __HI__);
__intN_t (32, __SI__);
__intN_t (64, __DI__);

int main(int argc, char *argv[])
{
    FILE * rawf;
    rawf = fopen("./rawPcm","wb");
    int16_t buff[] = {0,0,0};
    fwrite(buff,sizeof(int16_t), sizeof(buff),rawf);
    fwrite(buff,sizeof(int16_t), sizeof(buff),rawf);  
    fclose(rawf);
}

Die Ausgabe enthält jedoch mehr als nur Nullen.

$ hexdump -v rawPcm 
0000000 0000 0000 0000 85fd 0804 0001 0000 0000
0000010 0000 85fd 0804 0001                    
0000018

Es schreibt 0000 0000 0000 85fd 0804 0001 für jeden fwrite(buff,sizeof(int16_t), sizeof(buff),rawf); während ich erwarten würde, nur zu bekommen 0000 0000 0000.

Was bedeuten die zusätzlichen Daten? 85fd 0804 0001 und wie verhindere ich das?

  • (Fast) minimales und vollständiges Beispiel, beobachtete Ausgabe, erwartete Ausgabe. Sie, Sir, verdienen eine Medaille. 😀

    – DevSolar

    22. Juli 2015 um 7:36 Uhr


  • Guter alter Pufferüberlauf 🙂

    – Luan

    22. Juli 2015 um 8:09 Uhr

Benutzer-Avatar
Mohit Jain

Was bedeuten die zusätzlichen Daten? 85fd 0804 0001

Möglicherweise einige zufällige Mülldaten.

wie kann ich verhindern, dass es auftritt?

fwrite(buff,sizeof(int16_t), sizeof(buff),rawf); sollte geschrieben werden als:

fwrite(buff,sizeof(int16_t), sizeof(buff) / sizeof(buff[0]),rawf);
/*               ^                          ^^^^^^^^^^^^^^^      */
/*       size of each object      Count of objects               */
/*              (2)                  (3)                         */

/* or */
fwrite(buff, sizeof buf[0], sizeof buff / sizeof buff[0], rawf);

sizeof buff / sizeof buff[0] erhält die Array-Länge in Anzahl von Objekten (oder Mitgliedern) while sizeof buff Gibt die Größe des Arrays in Bytes an.

Sie lesen also an der vorbei buff und Schreiben in die Datei und Aufrufen undefiniertes Verhalten. In Ihrem Fall sehen Sie, dass die zufälligen Mülldaten in die Ausgabedatei geschrieben werden.

In Ihrem Fall, sizeof von jedem Element in buff ist 2 Byte und buff Das Array hat 3 Mitglieder, wodurch die Gesamtgröße 6 Byte beträgt. Wenn du schreibst fwrite(buff,sizeof(int16_t), sizeof(buff),rawf);werden 6 Objekte mit je 2 Byte in die Datei geschrieben, was Sie nicht möchten.

Jetzt schreiben Sie 6 Daten vom Typ (Größe) int16_t ab buff[0] dh buff[0..5] zum Ausgang. buff[0..2] sind 0s wie erwartet und buff[3..5] sind Müll.

  • Wäre es nicht besser zu verwenden sizeof(buff[0]) auch für das Argument der Elementgröße?

    – Oberst Zweiunddreißig

    22. Juli 2015 um 14:28 Uhr

  • @ColonelThirtyTwo Ja, das ist vorzuziehen.

    – Mohit Jain

    22. Juli 2015 um 14:54 Uhr

Das dritte Argument von fwrite ist der Nummer von Elementen der durch den zweiten Parameter angegebenen Größe. Es ist nicht die Gesamtgröße in Bytes, was Sie gerade tun.

Sie überlaufen also Ihren Puffer.

1204610cookie-checkOverhead-Daten beim Schreiben in eine Binärdatei

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy