2011-01-26 5 views
0

特に、私はバイナリファイルでFPGAをプログラムしようとしています。トランザクションレジスタは16ビット幅です。だから私はuint16_tの配列を作成し、それを入力ファイルで埋める必要があります。ここに私が試したものです:C++では、charデータ型よりも広い配列にファイルを正しく読み込むにはどうすればよいですか?

int bufferSize = 512; 
uint16_t buffer[bufferSize]; 
std::ifstream *pStream = new std::ifstream(filepath); 
if(pStream->is_open() == true) 
{ 
    pStream->read((char *)buffer, bufferSize); 
} 

私はGDBを通じて伝えることができるものから、(すなわち、0xBEEFを期待0xEFBEを得ました。)各配列ノードが逆方向にあるようだ

+0

BTW: 'if(pStream-> is_open()== true)'は一種のprolixです。 – TonyK

+0

@TonyK合意。私はコーディングスタイルの制約の下にいる:それは私にもバグだ。 「もしかして」はかなり明白に聞こえる。 –

+0

'pStream-> read((char *)buffer、bufferSize * sizeof(uint16_t));も使用してください。そうでなければ、書き込みを期待していたデータの半分だけを書きます。しかし、本当の問題は、もちろん、Big vs Little Endiannessです。 –

答えて

3

あなたが、エンディアンに実行したようです問題。必要なエンディアンを得るには、htons()などを使用する必要があります。 (アレイのすべての要素、例えばループまたはstd::transformでそれを使用する)。詳細については、http://beej.us/guide/bgnet/output/html/multipage/htonsman.htmlを参照してください。

+0

これらのツールはUnixのバックグラウンドを持っていますが、ビッグエンディアンはそうではありません。 –

+0

しかし、注意してください。データの最終的な出力先が入力と同じであれば、それを変換したくないかもしれません。詳細はわかりませんが、ファイルが配列にロードされてプログラマにプッシュされた場合は、ファイルソースとプログラマがエンディアンに何を使用しているかを再確認してください。 –

+0

ビッグエンディアンスワップが必要でした。エタリオンありがとう –

関連する問題