2016-06-15 13 views
0

私は整数値としてファイルのいくつかのバイトを読みたいと思っています。C++ ByteをIntegerとして読み込む方法endianness independent?

ifstream input ("C:/Desktop/myFile", ios::binary); 
uint8_t buffer[4] = {0}; 
input.read((char*)buffer, sizeof(buffer)); 

しかし、どのように私は、対応する整数値955にバッファ配列を変換することができます。たとえば、ファイルは、私がデータをこのように読むことができる955

に等しい値0x000003BBが含まれていますか?また、エンディアン独立型の方法で可能な場合、ビッグエンディアンのバイトオーダーのこのファイルと他のいくつかのファイルは、リトルエンディアンのバイトオーダーになっています。ありがとう:)

答えて

1

私はこれが最善の解決策であるとは確信していませんが、それは動作します。

uint8_t buffer[4] = {0}; 
input.read((char*)buffer, sizeof(buffer)); 
unsigned int result = buffer[0]; 
result = (result << 8) | buffer[1]; 
result = (result << 8) | buffer[2]; 
result = (result << 8) | buffer[3]; 
+0

それはエンディアンを考慮していませんでした。私がデータを出力した場合、varは'0xBB030000 'に等しい値'3137536000'を持っていますが、'0x000003BB 'を得る必要があります – Opa114

+0

@ Opa114実際にこのコードはエンディアンを*任意のエンディアン。単純に間違いがあります。これは、あなたが望むビッグエンディアンではなく、* little *エンディアンを変換します。バッファのインデックスを0から3に変更すると、動作します。 – user2079303

+0

@ user2079303ヒントありがとう! – Opa114

1

uint8_tの配列を使用する必要はありません、あなたが直接使う4バイトの整数に読み込むことができます。

uint32_t data; 
input.read((char*)&data, sizeof(data)); 

EDIT:

このコードは、私のVC++コンパイラで動作します:

#include<stdint.h> 
#include<intrin.h> 
#include<iostream> 

int main() 
{ 
    uint32_t data; 
    data = 0xBB030000; 
    data = _byteswap_ulong(data); 

    std::cout << data; 
} 

GCCを使用している場合は、_byteswap_ulong__builtin_bswap32である。独立したコードが必要な場合は、独自のコードを作成する必要があります(おそらく、これらのコンパイラ組み込み関数の上にあります)。

+0

これは動作しますが、エンディアンを考慮しませんでした。私がデータを出力した場合、varは '3137536000'という値を'0xBB030000 'としますが、' 0x000003BB'を取得する必要があります – Opa114

+0

これは役に立ちます:http://stackoverflow.com/a/105339/264325 – Ajay

+0

まだ落ちます同じトラップ、Ajay。 OPはファイルが大きいか小さいかを知らず、両方の場合を処理する汎用コードを必要とします。エンディアンを指定しないファイルプロトコルには欠陥があり、再設計のためにラボに戻る必要がありますが、... – user4581301

1

お使いのOSがPOSIXをサポートしていますか、Windowsの場合は、ntohlを使用することができます。

int data; 
input >> data; 
data = ntohl(data); 
+2

Windowsでは、 'Ws2_32.lib'へのリンクが必要です。 – Ajay

関連する問題