从WAV文件中使用十六进制的C显示数据

时间:2013-10-16 05:00:45

标签: c file wav

因为我用C语言编码已经有一段时间但是有些奇怪的事情正在发生。也许有人可以运行我的代码,看看输出是否相同。它似乎不是打印零,并且“数据输出”似乎不打印。

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <io.h>
#include <conio.h>

void main(void)
{
    int i;
    long n;
    FILE *wavFile;
    printf("The data output \n\n\r");
    wavFile = fopen("bigbrain.wav","rb");
    while(feof(wavFile)==0)
    {
        i = getw(wavFile);

        if(ferror(wavFile)!=0)
        {
            printf("\n an error has occured");
            n = ftell(wavFile);
            printf("\nThe value of n is %ld",n);
            getch();
        }   
    printf("%x",i);
    }

    n = ftell(wavFile);
    printf("\n\The value of n is %ld",n);
    fclose(wavFile);
    printf("\n\nEnd of File");
    getch();
} 

我从中得到的结果是。由于它是一个波形文件,我认为应该有一些占位零。有没有人看错了什么?

4646495212c524556415720746d6610100012b112b118 

这就是我通过交叉引用手动打破数据的方式,我知道应该在那里。

//Winamp says Unsigned 8-bit PCM; 1 channel; 11025Hz
46464952    //"RIFF"
12c52       //size: actuall size 76890, says 76882. My doc says correct because minus 8 bits for fields not included
45564157    //format "WAVE"
20746d66    //subchunkID 0x666d7420 but in big endian
10100012    //subchunk 1 size, expecting 16 
b1          //audio format
1           //number of channels
2b11        //sample rate: file should be 11025 (ox2b11)
8000        //byte rate
            //block align
1           //bits per sample... i think it cut off zero so 0x10 for 16
61746164    //start of data it's "data" 0x64617461 in big endian

1 个答案:

答案 0 :(得分:1)

更改

printf("%x",i);

printf("%08x, i);

这将确保打印8位数字,前导零。

此外,在解析波形文件时,您可能会fread将标头放入缓冲区,您将检查该缓冲区,而不是在{{{}中逐字节 1 工作。 1}}循环。

1 - 实际上是逐字逐句,因为你使用!feof(),我甚至都不知道。