.wav C ++数据输出不正确

时间:2012-08-27 10:00:45

标签: c++

所以我知道我之前已经问过这个问题,然而,在我继续我的项目之前,我仍然陷入困境。基本上,我正在尝试读取.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;
     }

任何帮助都会非常感激。我希望我已经提供了足够的细节。

谢谢。

1 个答案:

答案 0 :(得分:1)

我认为你的代码有几个问题。其中一个是演员表,例如这一个:

 unsigned int *te;                           
 te = reinterpret_cast<int*>(&this->data);     // (2)
 cout << te[3];                                

te 是指向 unsigned int 的指针,而您尝试转换为指向 int 的指针。我希望第(2)行编译错误......

te [3] 是什么意思?我希望来自 *(te + 3)内存位置的垃圾可以在这里输出。