2016-09-17 6 views
1

私のマシンはリトルエンディアンで動作します。 ビッグエンディアンエンコーディングのC++ std :: ios :: binaryを使って読みなければなりません。それを行うための標準と速い方法がありますか?瞬間のために 、生のデータを読んだ後、私は次のようにします。bigendianで書かれたファイルを読む

(ダブルを読んで)

char raw [8]; 
double d = 0; //maybe initialization is not needed 
file.read(raw,8); //4 for an int 
for(int k = 0; k < 8; k++) { 
    memcpy((void *)(((char *)(&d))+k), (const void *)(raw+j+7-k), 1); 
} 

(整数を読み込む)

char raw [4]; 
file.read(raw,4); //4 for an int 
int i = (raw[j] << 24) | (raw[j+1] << 16) | (raw[j+2] << 8) | raw[j+3]; 
+2

'男もhtonl' –

+0

、代わりに(可能性が非常に高い間違った)' 4'、および 'はsizeof(ダブル)の代わりに' '8'の'はsizeof(int型) ''男ntohl'。 –

+0

@WilliamPursell彼はファイルを読み込んでいるので、4は問題ありません。しかし、それはターゲットアーキテクチャで適切なものに変換する必要がありますが、私は同意します。 – JustSid

答えて

1

htonlntohlを(使用してくださいhost to network long "と" network to host long ")は、ホストとネットワークのバイトオーダーを変換する機能を持ちます。ネットワークバイトオーダーはビッグエンディアンで、ホストのバイトオーダーはリトルエンディアンです。

intではなく、この種のビットマングリングを実行するときは、常に明示的なサイズの符号なし整数型を使用する必要があります。希望のタイプのデータに後でたとえばreinterpret_castを入力することができます。 uint64_tで始まり、doubleで読んでください。

uint32_t little_endian_thing; 
uint32_t big_endian_thing; 
file.read(&big_endian_thing, sizeof(uint32_t)); 
little_endian_thing = ntohl(big_endian_thing); 
関連する問題