#include "stdlib.h"
#include "stdio.h"
void main()
{
//用作循环计数
int i;
unsigned char ch[100];
FILE *fp;
//用来存储 wav 文件的头信息
fp=fopen("1.wav","rb");//为读,打开一个 wav 文件
if((fp=fopen("1.wav","rb"))==NULL) //若打开文件失败,退出
{
printf("can't open this file\n");
exit(0);
}
/**********输出 wav 文件的所有信息**********/
printf("该 wav 文件的所有信息:");
for(i=0;i<58;i++)
{
ch[i]=fgetc(fp); //每次读取一个字符,存在数组 ch 中
if(i%16==0)
//每行输出 16 个字符对应的十六进制数
printf("\n");
if(ch[i]<16)
//对小于 16 的数,在前面加 0,使其用 8bit 显示出来
printf("0%x ",ch[i]);
else
printf("%x ",ch[i]);
}
/*********RIFF WAVE Chunk 的输出*********/
printf("\n\nRIFF WAVE Chunk 信息:");
//输出 RIFF 标志
printf("\nRIFF 标志:");
for(i=0;i<4;i++)
{
printf("%x ",ch[i]);
}
//输出 size 大小
printf("\nsize:ox");
for(i=7;i>=4;i--) //低字节表示数值低位,高字节表示数值高位
{
if(ch[i]<16)
printf("0%x",ch[i]);
else
printf("%x",ch[i]);
}
//输出 WAVE 标志
printf("\nWAVE 标志:");
for(i=8;i<12;i++)
{
if(ch[i]<16)
printf("0%x ",ch[i]);
else
printf("%x ",ch[i]);
}
/*******Format Chunk 的输出*******/
printf("\n\nFormat Chunk 信息:");
//输出 fmt 标志
printf("\nfmt 标志:");
for(i=12;i<16;i++)
{
if(ch[i]<16)
printf("0%x ",ch[i]);
else
printf("%x ",ch[i]);
}
//输出 size 段
printf("\nsize:ox");
for(i=19;i>15;i--)
{
if(ch[i]<16)
printf("0%x",ch[i]);
else
printf("%x",ch[i]);
}
//输出编码方式
printf("\n 编码方式:ox");
for(i=21;i>19;i--)
{
if(ch[i]<16)
printf("0%x",ch[i]);
else
printf("%x",ch[i]);
}
//输出声道数目
printf("\n 声道数目:ox");
for(i=23;i>21;i--)
{
if(ch[i]<16)
printf("0%x",ch[i]);
else
printf("%x",ch[i]);
}
if(ch[i+1]==1)
//1 表示单声道,2 表示双声道
else
printf(" 单声道");
printf(" 双声道");
//输出采样频率
printf("\n 采样频率:ox");
for(i=27;i>23;i--)
{
if(ch[i]<16)
printf("0%x",ch[i]);
else
printf("%x",ch[i]);
}
//输出每秒所需字节数
printf("\n 每秒所需字节数:ox");
for(i=31;i>27;i--)
{
if(ch[i]<16)
printf("0%x",ch[i]);
else
printf("%x",ch[i]);
}
//输出数据块对齐单位
printf("\n 数据块对齐单位:ox");
for(i=33;i>31;i--)
{
if(ch[i]<16)
printf("0%x",ch[i]);
else
printf("%x",ch[i]);
}
//输出每个采样所需 bit 数
printf("\n 每个采样所需 bit 数:ox");
for(i=35;i>33;i--)
{
if(ch[i]<16)
printf("0%x",ch[i]);
else
printf("%x",ch[i]);
}
//输出附加信息
if(ch[16]==18)
//若 Format Chunk 的 size 大小为 18,则该模块的最后两个字节为附加
信息
{
//若为 16,则无附加信息
printf("\n 附加信息:ox");
for(i=37;i>35;i--)
{
if(ch[i]<16)
else
printf("0%x",ch[i]);
printf("%x",ch[i]);
}
}
/*******Fact Chunk 的输出*******/
printf("\n\nFact Chunk 信息:");
//输出 fact 标志
printf("\nfact 标志:");
for(i=38;i<42;i++)
{
if(ch[i]<16)
printf("0%x ",ch[i]);
else
printf("%x ",ch[i]);
}
//输出 size
printf("\nsize:ox");
for(i=45;i>41;i--)
{
if(ch[i]<16)
printf("0%x",ch[i]);
else
printf("%x",ch[i]);
}
//输出 data 段数据
printf("\ndata 段数据:");
for(i=46;i<50;i++)
{
if(ch[i]<16)
printf("0%x ",ch[i]);
else
printf("%x ",ch[i]);
}
/*******Data Chunk 的输出*******/
printf("\n\nData Chunk 信息:");
//输出 data 标志
printf("\ndata 标志:");
for(i=50;i<54;i++)
{
if(ch[i]<16)
printf("0%x ",ch[i]);
else
printf("%x ",ch[i]);
}
//输出数据大小
printf("\n 数据大小:ox");
for(i=57;i>53;i--)
{
if(ch[i]<16)
printf("0%x",ch[i]);
else
printf("%x",ch[i]);
}
printf("\n");
fclose(fp);
}