如何正确读取C+中的波形文件采样率+;? 在学习Wave文件格式和C++的同时,出于好奇,我偶然发现了WAVE格式的规范布局。 现在,我试着写一个C++程序来读出样本率 char buffer[4]; // already read other values before reading sample rate inFile.read(buffer, 4); // conversion using little endian sampleRate = (long) buffer[0] + ((long) buffer[1] << 8) + ((long) buffer[2] << 16) + ((long) buffer[3] << 24); char缓冲区[4]; //在读取采样率之前已读取其他值 填充读取(缓冲区,4); //使用小端元的转换 sampleRate=(长)缓冲区[0]+((长)缓冲区[1]
最简单的方法如下:如何正确读取C+中的波形文件采样率+;? 在学习Wave文件格式和C++的同时,出于好奇,我偶然发现了WAVE格式的规范布局。 现在,我试着写一个C++程序来读出样本率 char buffer[4]; // already read other values before reading sample rate inFile.read(buffer, 4); // conversion using little endian sampleRate = (long) buffer[0] + ((long) buffer[1] << 8) + ((long) buffer[2] << 16) + ((long) buffer[3] << 24); char缓冲区[4]; //在读取采样率之前已读取其他值 填充读取(缓冲区,4); //使用小端元的转换 sampleRate=(长)缓冲区[0]+((长)缓冲区[1],c++,hex,C++,Hex,最简单的方法如下: // simply store bytes directly into sampleRate long sampleRate = 0; inFile.read(&sampleRate, 4); 正如您可能怀疑的那样,这假设您的系统是little Endian。要修复您的示例,您必须避免在强制转换为long时发生的符号扩展。声明类型为unsigned char的buffer。请参阅以下内容 unsigned char buffer[4]; inFile.read(bu
// simply store bytes directly into sampleRate
long sampleRate = 0;
inFile.read(&sampleRate, 4);
正如您可能怀疑的那样,这假设您的系统是little Endian。要修复您的示例,您必须避免在强制转换为long时发生的符号扩展。声明类型为unsigned char
的buffer
。请参阅以下内容
unsigned char buffer[4];
inFile.read(buffer, 4);
long sampleRate = (long)buffer[0] + ((long)buffer[1] << 8) + ((long)buffer[2] << 16) + ((long)buffer[3] << 24);
无符号字符缓冲区[4];
填充读取(缓冲区,4);
long sampleRate=(long)buffer[0]+((long)buffer[1]最简单的方法如下:
// simply store bytes directly into sampleRate
long sampleRate = 0;
inFile.read(&sampleRate, 4);
正如您可能怀疑的那样,这假设您的系统是little Endian。要修复您的示例,您必须避免在强制转换为long时发生的符号扩展。声明类型为unsigned char
的buffer
。请参阅以下内容
unsigned char buffer[4];
inFile.read(buffer, 4);
long sampleRate = (long)buffer[0] + ((long)buffer[1] << 8) + ((long)buffer[2] << 16) + ((long)buffer[3] << 24);
无符号字符缓冲区[4];
填充读取(缓冲区,4);
long sampleRate=(long)buffer[0]+((long)buffer[1]修复代码有两种方法。第一种方法是通过使所有内容都无符号来确保始终使用无符号算术。第二种方法是使用位掩码来删除符号扩展
sampleRate = ((long) buffer[0] & 0xff) + (((long) buffer[1] << 8) & 0xff00) + (((long) buffer[2] << 16) & 0xff0000) + ((long) buffer[3] << 24);
sampleRate=((长)缓冲区[0]&0xff)+((长)缓冲区[1]修复代码有两种方法。第一种方法是通过使所有内容都无符号来确保始终使用无符号算术。第二种方法是使用位掩码删除符号扩展
sampleRate = ((long) buffer[0] & 0xff) + (((long) buffer[1] << 8) & 0xff00) + (((long) buffer[2] << 16) & 0xff0000) + ((long) buffer[3] << 24);
sampleRate=((长)缓冲区[0]&0xff)+((长)缓冲区[1]缓冲区的类型是什么?
?尝试使用无符号的
。使用+
而不是
的原因是什么?@Xymostech,用于不重叠的位模式,它们是等效的。使用缓冲区类型更新了原始问题。实际上,我使用了默认的有符号字符[]。此外,infle是一个ifstream对象。sampleRate是long@Karoly,我开始了一个类似的线程,下面是Andrew的答案方法不接受无符号字符*我在Mac Mountain Lion上试过g++编译器,也试过cygwin的g++-3.exe编译器。两个编译器都抱怨无符号字符*缓冲区的类型是什么?无符号
?用无符号
试试。你为什么要用+
而不是
?@Xymostech来处理不重叠的位模式呢Equivalent.用缓冲区类型更新了原始问题。实际上,我使用了默认的带符号字符[]。此外,inflee是一个ifstream对象。sampleRate是long@Karoly,我开始了一个类似的线程,下面是Andrew的答案方法不接受无符号字符*我在Mac Mountain Lion上尝试了g++编译器,以及cygwin的g++-3.exe编译器。两个编译器都抱怨无符号字符*你的infle对象是什么类型的?它也是ifstream吗?我看到了很多使用无符号字符[]的建议(我原来的Q只使用默认的有符号字符[])但是,如果我使用unsigned,g++编译器会失控test.cpp:57:错误:从unsigned char*”到'char*'的转换无效test.cpp:57:错误:初始化'std::basic\u istream&std::basic\u istream::read(_CharT*,std::streamsize)[with _CharT=char,_Traits=std::char\u Traits]“
第57行引用了infle.read(缓冲区,4);
您的infle对象的类型是什么?它也是ifstream吗?我看到了一些使用无符号字符[]的建议(我原来的Q只使用默认的有符号字符[])但是,如果我使用unsigned,g++编译器会失控test.cpp:57:错误:从unsigned char*”到'char*'的转换无效test.cpp:57:错误:初始化'std::basic\u istream&std::basic\u istream::read(_CharT*,std::streamsize)[with _CharT=char,_Traits=std::char\u Traits]“
第57行指的是infle.read(缓冲区,4)
除了ifstream的read方法不使用无符号字符缓冲区外,您发布的代码工作得很好。它似乎也不会对基本系统运行大或小的endian进行假设。除了ifstream的read方法不使用无符号字符缓冲区外,您发布的代码工作得很好。它似乎也不会对运行大型或小型Endian的基本系统。