2015-04-08 2 views
2

Учитывая WAV-файл, я хотел бы распечатать ChunkSize, SubChunk1Size и SubChunk2Size.C, Wav File Chunk Sizes Issue

enter image description here

Ниже приведен код, который я написал:

#include <stdio.h> 
#include <stdlib.h> 

struct wavFile{ 

    char ChunkID[4]; //"RIFF", GOOD 
    unsigned int ChunkSize; 
    char Format[4]; //"WAVE", GOOD 
    char Subchunk1ID[4]; //"fmt", GOOD 
    unsigned int Subchunk1Size; //GOOD 
    unsigned short int AudioFormat; //GOOD 
    unsigned short int NumChannels; //GOOD 
    unsigned int SampleRate; //GOOD 
    unsigned int ByteRate; 
    unsigned int BlockAlign; 
    unsigned int BitsPerSample; 
    char SubChunk2ID[4]; //"data", prints weird symbols instead of "data" 
    unsigned int Subchunk2Size; 

}; 

int main() 
{ 
    struct wavFile w; 
    int headerSize = sizeof(w); 
    FILE *fp; 

    fp = fopen(wavFilePathGoesHere, "r"); 
    fread(&w, headerSize, 1, fp); 



    printf("ChunkSize: %d, SubChunk1Size: %d, SubChunk2Size: %d\n", w.ChunkSize, w.Subchunk1Size, w.Subchunk2Size); 
    //SubChunk2Size: -76154081 

    fclose(fp); 
    return 0; 
} 

Переменные, которые я комментировал в структуре как «хорошее» на самом деле дают правильных значения, так что то хорошее. Оператор printf дает отрицательное значение SubChunk2Size (-76154081). Конечно, это не так. Я не знаю, что я здесь делаю неправильно.

+2

Является ли ваш размер структуры правильным? Вам лучше проверить это, а затем упаковать, чтобы он работал правильно. –

+0

Если честно, я не уверен на 100%. Я буквально только что узнал о структурах. Я совершенно не знаком с C. –

+1

Помните, что не все архитектуры используют немного endian, поэтому простое чтение данных непосредственно в память, как это, не переносимо. Кроме того, Карл Норум поднял вопрос о упаковке. Опять же, это переносимость, которая не всегда дает одинаковые результаты для разных компиляторов. Если вы заинтересованы, прочитайте дополнительную информацию о структуре. – paddy

ответ

2

Используйте %u не %d для вашего printf без знака. См http://www.cplusplus.com/reference/cstdio/printf/ специально

specifier Output     Example 
d or i  Signed decimal integer 392 
u   Unsigned decimal integer 7235 
+0

Правильно! Я не знал, что мне нужно использовать u для неподписанного типа –

+0

. См. Другие комментарии и ответы о правильном согласовании структуры с спецификацией данных. У вас может быть несколько проблем. Но% u vs% d также вызовет у вас проблемы. –

2

BlockAlign и BitsPerSample должны быть шорты.

+0

Работает сейчас, спасибо –

+1

@ 0100100001101001 Пожалуйста, не забывайте принимать ответ, который исправляет вашу проблему. –