0

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

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

谢谢你。

4

1 回答 1

1

我认为您的代码存在几个问题。其中之一是演员表,例如这个:

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

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

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

于 2012-08-27T11:59:39.430 回答