Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 读取未格式化的.wav文件中的字节数的程序会产生奇怪的结果吗?_C_Numbers_Byte_Wav - Fatal编程技术网

C 读取未格式化的.wav文件中的字节数的程序会产生奇怪的结果吗?

C 读取未格式化的.wav文件中的字节数的程序会产生奇怪的结果吗?,c,numbers,byte,wav,C,Numbers,Byte,Wav,首先,当我运行程序时,它会打印一个空空间,然后在应该打印“WAVE”的时候打印AVE。其次,每次打印字符串时,它都会将“RIFF”(已打印)与“AVE”连接起来,然后将“AVE RIFF”与“fmt”连接起来,然后将“fmt AVE RIFF”与“data”连接起来。它还为BlockAlign提供了不同的值。当我使用结构时,这一切都不会发生,但是当我删除结构时(我应该为这个项目这么做),它会给我不同的结果。我的代码怎么了 #include <stdio.h> #include <

首先,当我运行程序时,它会打印一个空空间,然后在应该打印“WAVE”的时候打印AVE。其次,每次打印字符串时,它都会将“RIFF”(已打印)与“AVE”连接起来,然后将“AVE RIFF”与“fmt”连接起来,然后将“fmt AVE RIFF”与“data”连接起来。它还为BlockAlign提供了不同的值。当我使用结构时,这一切都不会发生,但是当我删除结构时(我应该为这个项目这么做),它会给我不同的结果。我的代码怎么了

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

int main() {
    FILE *fp;
    unsigned int ChunkSize, SubChunk1Size, SubChunk2Size, RIFFSize, fmtSize, dataSize, SampleRate, ByteRate, BlockAlign;
    unsigned short int AudioFormat, NumChannels, BitsPerSample;
    char ChunkID[4], Format[4], Subchunk1ID[3], Subchunk2ID[4];
    //open file
    fp = fopen("giants.wav", "rb");
    if (!fp) {
        printf("Error: file does not exist.\n");
        return EXIT_FAILURE;
    }
    //read into
    //RIFF
    fseek(fp, 0, SEEK_SET);
    fread(ChunkID, 1, 4, fp);
    //ChunkSize
    fseek(fp, 4, SEEK_SET);
    fread(&ChunkSize, 1, 4, fp);
    //WAVE
    fseek(fp, 8, SEEK_SET);
    fread(Format, 1, 4, fp);
    //fmt
    fseek(fp, 12, SEEK_SET);
    fread(Subchunk1ID, 1, 4, fp);
    //Subchunk1Size
    fseek(fp, 16, SEEK_SET);
    fread(&SubChunk1Size, 1, 4, fp);
    //AudioFormat
    fseek(fp, 20, SEEK_SET);
    fread(&AudioFormat, 1, 2, fp);
    //NumChannels
    fseek(fp, 22, SEEK_SET);
    fread(&NumChannels, 1, 2, fp);
    //SampleRate
    fseek(fp, 24, SEEK_SET);
    fread(&SampleRate, 1, 4, fp);
    //ByteRate
    fseek(fp, 28, SEEK_SET);
    fread(&ByteRate, 1, 2, fp);
    //BlockAlign
    fseek(fp, 32, SEEK_SET);
    fread(&BlockAlign, 1, 4, fp);
    //BitsPerSample
    fseek(fp, 34, SEEK_SET);
    fread(&BitsPerSample, 1, 2, fp);
    //data
    fseek(fp, 36, SEEK_SET);
    fread(Subchunk2ID, 1, 4, fp);
    //Size of Subchunk2Size
    fseek(fp, 40, SEEK_SET);
    fread(&SubChunk2Size, 1, 4, fp);
    //close file
    fclose(fp);
    //get sizes
    fmtSize = SubChunk1Size + 8;
    dataSize = SubChunk2Size + 8;
    RIFFSize = ChunkSize + 8 - (fmtSize + dataSize);
    //print chars and sizes
    printf("RIFF Size:     %d\n", RIFFSize);
    printf("fmt Size:      %d\n", fmtSize);
    printf("data Size:     %d\n\n", dataSize);
    printf("ChunkID:       %s\n", ChunkID);
    printf("ChunkSize:     %d\n", ChunkSize);
    printf("Format:        %s\n\n", Format);
    printf("Subchunk1ID:   %s\n", Subchunk1ID);
    printf("Subchunk1Size: %d\n", SubChunk1Size);
    printf("AudioFormat:   %d\n", AudioFormat);
    printf("NumChannels:   %d\n", NumChannels);
    printf("SampleRate:    %d\n", SampleRate);
    printf("ByteRate:      %d\n", ByteRate);
    printf("BlockAlign:    %d\n", BlockAlign);
    printf("BitsPerSample: %d\n\n", BitsPerSample);
    printf("Subchunk2ID:   %s\n", Subchunk2ID);
    printf("Subchunk2Size: %d\n", SubChunk2Size);
    //exit the program
    return EXIT_SUCCESS;
}
#包括
#包括
int main(){
文件*fp;
unsigned int ChunkSize、SubChunk1Size、SubChunk2Size、RIFFSize、fmtSize、dataSize、SampleRate、ByteRate、BlockAlign;
无符号短整数音频格式、数字通道、位采样;
char ChunkID[4],Format[4],Subchunk1ID[3],Subchunk2ID[4];
//打开文件
fp=fopen(“巨人”wav,“rb”);
如果(!fp){
printf(“错误:文件不存在。\n”);
返回退出失败;
}
//读入
//里夫
fseek(fp,0,SEEK_集);
fread(ChunkID,1,4,fp);
//块大小
fseek(fp,4,SEEK_SET);
fread(和ChunkSize,1,4,fp);
//挥手
fseek(fp,8,SEEK_SET);
fread(格式,1,4,fp);
//fmt
fseek(fp,12,SEEK_SET);
fread(亚chunk1id,1,4,fp);
//亚成片尺寸
fseek(fp,16,SEEK_SET);
fread(1号、4号、fp号和次成堆尺寸);
//音频格式
fseek(fp,20,SEEK_SET);
fread(音频格式,1,2,fp);
//数字通道
fseek(fp,22,SEEK_SET);
fread(和NumChannels,1,2,fp);
//采样器
fseek(fp,24,SEEK_SET);
fread(和采样器,1,4,fp);
//拜特
fseek(fp,28,SEEK_SET);
fread(和ByteRate,1,2,fp);
//块对齐
fseek(fp,32,SEEK_SET);
fread(和BlockAlign,1,4,fp);
//比特采样
fseek(fp,34,SEEK_SET);
fread(&BitsPerSample,1,2,fp);
//资料
fseek(fp,36,SEEK_SET);
fread(亚chunk2id,1,4,fp);
//子块大小
fseek(fp,40,SEEK_SET);
fread(尺寸为1、4、fp的分块和分块);
//关闭文件
fclose(fp);
//获取尺寸
fmtSize=次弹簧尺寸+8;
数据大小=子块大小+8;
RIFFSize=ChunkSize+8-(fmtSize+dataSize);
//打印字符和大小
printf(“RIFF大小:%d\n”,RIFFSize);
printf(“fmt大小:%d\n”,fmt大小);
printf(“数据大小:%d\n\n”,数据大小);
printf(“ChunkID:%s\n”,ChunkID);
printf(“ChunkSize:%d\n”,ChunkSize);
printf(“格式:%s\n\n”,格式);
printf(“子chunk1id:%s\n”,子chunk1id);
printf(“Subchunk1Size:%d\n”,Subchunk1Size);
printf(“音频格式:%d\n”,音频格式);
printf(“NumChannels:%d\n”,NumChannels);
printf(“采样器:%d\n”,采样器);
printf(“字节:%d\n”,字节);
printf(“块对齐:%d\n”,块对齐);
printf(“BitsPerSample:%d\n\n”,BitsPerSample);
printf(“Subchunk2ID:%s\n”,Subchunk2ID);
printf(“Subchunk2Size:%d\n”,Subchunk2Size);
//退出程序
返回退出成功;
}
以下是输出:

里夫舞尺寸:12

fmt尺寸:24

数据大小:2577064

ChunkID:RIFF

ChunkSize:2577092

格式:Averif

子chunk1id:fmt averif

分块尺寸:16

音频格式:1

数字频道:2

取样器:44100

拜特:45328

区块对齐:262146

位示例:16

Subchunk2ID:datafmt averif


Subchunk2Size:2577056

如注释中所述,每个字符数组的大小为5。另外,我的fread声明中有些尺寸不正确。更正和简化代码:

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

int main() {
    FILE *fp;
    unsigned int ChunkSize, SubChunk1Size, SubChunk2Size, RIFFSize, fmtSize, dataSize, SampleRate, ByteRate, BlockAlign;
    unsigned short int AudioFormat, NumChannels, BitsPerSample;
    char ChunkID[5], Format[5], Subchunk1ID[5], Subchunk2ID[5];
    ChunkID[4] = '\0';
    Format[4] = '\0';
    Subchunk1ID[4] = '\0';
    Subchunk2ID[4] = '\0';
    fp = fopen("giants.wav", "rb");
    if (!fp) {
        printf("Error: file does not exist.\n");
        return EXIT_FAILURE;
    }
    fread(ChunkID, 1, 4, fp);
    fread(&ChunkSize, 1, 4, fp);
    fread(Format, 1, 4, fp);
    fread(Subchunk1ID, 1, 4, fp);
    fread(&SubChunk1Size, 1, 4, fp);
    fread(&AudioFormat, 1, 2, fp);
    fread(&NumChannels, 1, 2, fp);
    fread(&SampleRate, 1, 4, fp);
    fread(&ByteRate, 1, 4, fp);
    fread(&BlockAlign, 1, 2, fp);
    fread(&BitsPerSample, 1, 2, fp);
    fread(Subchunk2ID, 1, 4, fp);
    fread(&SubChunk2Size, 1, 4, fp);
    fclose(fp);
    fmtSize = SubChunk1Size + 8;
    dataSize = SubChunk2Size + 8;
    RIFFSize = ChunkSize + 8 - (fmtSize + dataSize);
    printf("RIFF Size:     %d\n", RIFFSize);
    printf("fmt Size:      %d\n", fmtSize);
    printf("data Size:     %d\n\n", dataSize);
    printf("ChunkID:       %s\n", ChunkID);
    printf("ChunkSize:     %d\n", ChunkSize);
    printf("Format:        %s\n\n", Format);
    printf("Subchunk1ID:   %s\n", Subchunk1ID);
    printf("Subchunk1Size: %d\n", SubChunk1Size);
    printf("AudioFormat:   %d\n", AudioFormat);
    printf("NumChannels:   %d\n", NumChannels);
    printf("SampleRate:    %d\n", SampleRate);
    printf("ByteRate:      %d\n", ByteRate);
    printf("BlockAlign:    %d\n", BlockAlign);
    printf("BitsPerSample: %d\n\n", BitsPerSample);
    printf("Subchunk2ID:   %s\n", Subchunk2ID);
    printf("Subchunk2Size: %d\n", SubChunk2Size);
    return EXIT_SUCCESS;
}
#包括
#包括
int main(){
文件*fp;
unsigned int ChunkSize、SubChunk1Size、SubChunk2Size、RIFFSize、fmtSize、dataSize、SampleRate、ByteRate、BlockAlign;
无符号短整数音频格式、数字通道、位采样;
char ChunkID[5],Format[5],Subchunk1ID[5],Subchunk2ID[5];
ChunkID[4]='\0';
格式[4]='\0';
子chunk1id[4]='\0';
Subchunk2ID[4]='\0';
fp=fopen(“巨人”wav,“rb”);
如果(!fp){
printf(“错误:文件不存在。\n”);
返回退出失败;
}
fread(ChunkID,1,4,fp);
fread(和ChunkSize,1,4,fp);
fread(格式,1,4,fp);
fread(亚chunk1id,1,4,fp);
fread(1号、4号、fp号和次成堆尺寸);
fread(音频格式,1,2,fp);
fread(和NumChannels,1,2,fp);
fread(和采样器,1,4,fp);
fread(和ByteRate,1,4,fp);
fread(和BlockAlign,1,2,fp);
fread(&BitsPerSample,1,2,fp);
fread(亚chunk2id,1,4,fp);
fread(尺寸为1、4、fp的分块和分块);
fclose(fp);
fmtSize=次弹簧尺寸+8;
数据大小=子块大小+8;
RIFFSize=ChunkSize+8-(fmtSize+dataSize);
printf(“RIFF大小:%d\n”,RIFFSize);
printf(“fmt大小:%d\n”,fmt大小);
printf(“数据大小:%d\n\n”,数据大小);
printf(“ChunkID:%s\n”,ChunkID);
printf(“ChunkSize:%d\n”,ChunkSize);
printf(“格式:%s\n\n”,格式);
printf(“子chunk1id:%s\n”,子chunk1id);
printf(“Subchunk1Size:%d\n”,Subchunk1Size);
printf(“音频格式:%d\n”,音频格式);
printf(“NumChannels:%d\n”,NumChannels);
printf(“采样器:%d\n”,采样器);
printf(“字节:%d\n”,字节);
printf(“块对齐:%d\n”,块对齐);
printf(“BitsPerSample:%d\n\n”,BitsPerSample);
printf(“Subchunk2ID:%s\n”,Subchunk2ID);
printf(“Subchunk2Size:%d\n”,Subchunk2Size);
返回退出成功;
}

这可能不相关,但是如果
chunkId
是4个字节,并且您想将其打印为字符串,那么您需要5个字节,以便可以添加0终止符…在
结构中至少使用
stdint.h
类型,而不是使用未指定长度的一堆变量。并检查标量的endianess。