logo资料库

c读取.wav文件.doc

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
#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); }
分享到:
收藏