所以我知道我之前已经问过这个问题,然而,在我继续我的项目之前,我仍然陷入困境。基本上,我正在尝试读取.wav文件,我已阅读所有必需的头信息,然后将所有数据存储在char数组中。这一切都很好,但是,然后我将数据重新整理为整数并尝试输出数据。
我已经测试了MatLab中的数据,但是,我得到了非常不同的结果:
Matlab -0.0078
C ++:1031127695
现在这些都是非常错误的结果,有人从这里说,这是因为我将它输出为整数,但是,我已经尝试了几乎所有单一数据类型并仍然得到错误的结果。有人建议它可能与Endianness有关(http://en.wikipedia.org/wiki/Endianness)。这看起来合乎逻辑吗?
以下是代码:
bool Wav::readHeader(ifstream &file)
{
file.read(this->chunkId, 4);
file.read(reinterpret_cast<char*>(&this->chunkSize), 4);
file.read(this->format, 4);
file.read(this->formatId, 4);
file.read(reinterpret_cast<char*>(&this->formatSize), 4);
file.read(reinterpret_cast<char*>(&this->format2), 2);
file.read(reinterpret_cast<char*>(&this->numChannels), 2);
file.read(reinterpret_cast<char*>(&this->sampleRate), 4);
file.read(reinterpret_cast<char*>(&this->byteRate), 4);
file.read(reinterpret_cast<char*>(&this->align), 2);
file.read(reinterpret_cast<char*>(&this->bitsPerSample), 4);
char testing[4] = {0};
int testingSize = 0;
while(file.read(testing, 4) && (testing[0] != 'd' ||
testing[1] != 'a' ||
testing[2] != 't' ||
testing[3] != 'a'))
{
file.read(reinterpret_cast<char*>(&testingSize), 4);
file.seekg(testingSize, std::ios_base::cur);
}
this->dataId[0] = testing[0];
this->dataId[1] = testing[1];
this->dataId[2] = testing[2];
this->dataId[3] = testing[3];
file.read(reinterpret_cast<char*>(&this->dataSize), 4);
this->data = new char[this->dataSize];
file.read(data, this->dataSize);
unsigned int *te;
te = reinterpret_cast<int*>(&this->data);
cout << te[3];
return true;
}
任何帮助都会非常感激。我希望我已经提供了足够的细节。
谢谢。
答案 0 :(得分:1)
我认为你的代码有几个问题。其中一个是演员表,例如这一个:
unsigned int *te;
te = reinterpret_cast<int*>(&this->data); // (2)
cout << te[3];
te 是指向 unsigned int 的指针,而您尝试转换为指向 int 的指针。我希望第(2)行编译错误......
te [3] 是什么意思?我希望来自 *(te + 3)内存位置的垃圾可以在这里输出。