搜索
bottom↓
回复: 6

WAVE文件用TurboC转换成数组的问题

[复制链接]

出0入0汤圆

发表于 2011-7-20 21:46:02 | 显示全部楼层 |阅读模式
最近在学习Arm的IIS接口,碰到要将WAVE文件转化成数组文件的情况
手头没有软件, 没有网络所以用TurboC编了一个程序进行转换
WAVE文件的头:RIFF header(8Bytes)前4字节固定为"RIFF",后4字节为总字节数(小端模式)
把WAV文件改名为TEST.wav 存放数组内容文件为ABC.txt

功能好像是完成了,但有两个疑问:
1)WAV文件的末尾有没有EOF字符?有懂行朋友给介绍一下
我是按没有EOF来处理的,文件长度包含在RIFF header中的.
2)末尾有好多0xFF,这个正常吗?这个是WindowXP关机的WAVE文件.

#include <stdio.h>
void main(void)
{
        FILE * fpin;
        FILE * fpout;
        unsigned char unchar, num[4];
        unsigned char i=4;
        long int length;
        unsigned char checkout=0;
        if((fpout=fopen("ABC.txt", "w"))==NULL)
        {
                printf("cannot open file ABC.txt\n");
                exit(0);
        }
        if((fpin=fopen("TEST.wav","r"))==NULL)
        {
                printf("cannot open file TEST.wav\n");
                exit(0);
        }

        /*output RIFF*/
        while(i--)
        {
        unchar = fgetc(fpin);
        fprintf(fpout,"0x%x, ", unchar);
       
        checkout++;
        if(checkout==10)
                {
                checkout = 0;
                fputs("\n",fpout);        /*每10个数换1次行*/
                }
        }
       
        /*output total number!*/
        i=4;
        while(i--)
        {
        unchar = fgetc(fpin);
        fprintf(fpout,"0x%x, ", unchar);
        num=unchar;
       
        checkout++;
        if(checkout==10)
                {
                checkout = 0;
                fputs("\n",fpout);        /*每10个数换1次行*/
                }
        }

        /*output large*/
        length=(long)(num[0])*256*256*256+(long)(num[1])*256*256+(long)(num[2])*256+num[3];
        printf("length=%ld ",length);
        while(length--)
        {
        unchar = fgetc(fpin);
        fprintf(fpout,"0x%x, ", unchar);
       
        checkout++;
        if(checkout==10)
                {
                checkout = 0;
                fputs("\n",fpout);        /*每10个数换1次行*/
                }
        }
       
        printf("\nTransform complete!\n");
        fclose(fpin);
        fclose(fpout);


}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-7-20 22:46:31 | 显示全部楼层
1)WAV文件的末尾有没有EOF字符?有懂行朋友给介绍一下
我是按没有EOF来处理的,文件长度包含在RIFF header中的.
-----------------------------------------------------
wav文件没有EOF字符

2)末尾有好多0xFF,这个正常吗?这个是WindowXP关机的WAVE文件.
-----------------------------------------------------
正常, 如果wav是8位, 0xFF 表示静音数据, 如果wav是16位, 0xFFFF 表示静音数据

出0入0汤圆

发表于 2011-7-20 23:13:04 | 显示全部楼层
用winhex打开wave文件。选中所有的wave数据。右键。复制为c代码

出0入0汤圆

发表于 2011-7-20 23:26:18 | 显示全部楼层
回复【2楼】lllaaa
-----------------------------------------------------------------------

2楼正解,winhex很好用

出0入0汤圆

 楼主| 发表于 2011-7-20 23:31:39 | 显示全部楼层
回复【2楼】lllaaa  
用winhex打开wave文件。选中所有的wave数据。右键。复制为c代码
-----------------------------------------------------------------------

谢谢你的建议 强大的16进制编辑软件 我的资料书上也是这样指导的只是断网的情况自己编写了个C

现在情况是我编写的程序输出结果和WinHex得出结果不完全一致?

出0入0汤圆

 楼主| 发表于 2011-7-20 23:36:07 | 显示全部楼层
回复【1楼】cheungman  
1)wav文件的末尾有没有eof字符?有懂行朋友给介绍一下
我是按没有eof来处理的,文件长度包含在riff header中的.
-----------------------------------------------------
wav文件没有eof字符

2)末尾有好多0xff,这个正常吗?这个是windowxp关机的wave文件.
-----------------------------------------------------
正常, 如果wav是8位, 0xff 表示静音数据, 如果wav是16位, 0xffff 表示静音数据

-----------------------------------------------------------------------

谢谢说明!
针对2)程序和WinHex处理得出结果不一致:WAV末尾处大部份是0,也有其它数,但这里只有0xFFFF

出0入0汤圆

 楼主| 发表于 2011-7-21 10:39:53 | 显示全部楼层
回复【5楼】bottomcoder  剑@手
-----------------------------------------------------------------------

对着教科书来调程序,正确的程序终于是调出来了,贴出来:
#include <stdio.h>
void main(void)
{
        FILE * fpin;
        FILE * fpout;
        unsigned char unchar, num[4];
        unsigned char i=4;
        long int length;
        unsigned char checkout=0;
        if((fpout=fopen("ABC.txt", "w"))==NULL)
        {
                printf("cannot open file ABC.txt\n");
                exit(0);
        }
        if((fpin=fopen("TEST.wav","rb"))==NULL)  /*用二进制文件读,解决读错误问题*/
        {
                printf("cannot open file TEST.wav\n");
                exit(0);
        }

        /*output RIFF*/
        while(i--)
        {
        unchar = fgetc(fpin);
        fprintf(fpout,"0x%X, ", unchar);
       
        checkout++;
        if(checkout==16)
                {
                checkout = 0;
                fputs("\n",fpout);        /*每16个数换1次行*/
                }
        }
        /*output total number!*/
        i=4;
        while(i--)
        {
        unchar = fgetc(fpin);
        fprintf(fpout,"0x%X, ", unchar);
        num=unchar;
       
        checkout++;
        if(checkout==16)
                {
                checkout = 0;
                fputs("\n",fpout);        /*每16个数换1次行*/
                }
        }

        /*output large*/
        length=(long)(num[0])*256*256*256+(long)(num[1])*256*256+(long)(num[2])*256+num[3];
        printf("length=%ld ",length);
        while(length--)
        {
        unchar = fgetc(fpin);
        fprintf(fpout,"0x%X, ", unchar);
       
        checkout++;
        if(checkout==16)
                {
                checkout = 0;
                fputs("\n",fpout);        /*每16个数换1次行*/
                }
       
        }
       
        printf("\nTransform complete!\n");
        fclose(fpin);
        fclose(fpout);


}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 17:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表