0

ですから、私は以前にこの質問をしたことがあることを知っていますが、私はまだ立ち往生していて、プロジェクトを進めることができません。基本的に、私は.wavファイルを読み込もうとしています。必要なすべてのヘッダー情報を読み込んでから、すべてのデータをchar配列内に格納しました。これはすべて問題ありませんが、データを整数として再キャストし、データを出力してみます。

MatLabでデータをテストしましたが、結果は大きく異なります。

Matlab -0.0078

C ++:1031127695

さて、これらは非常に間違った結果であり、ここから誰かが親切にそれを整数として出力しているためだと言いましたが、私はほとんどすべてのデータ型を試しましたが、それでも間違った結果が得られます。誰かがそれがエンディアンネス(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

あなたのコードにはいくつかの問題があると思います。それらの1つはキャストです。たとえば、これは次のとおりです。

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

teunsignedintへのポインタですが、 intへのポインタにキャストしようとしています。(2)行目でコンパイルエラーが発生すると思います。

そして、 te [3]とはどういう意味ですか?*(te + 3)メモリ位置からのガベージがここに出力されることを期待しています。

于 2012-08-27T11:59:39.430 に答える