2012-12-26 23 views
6

Dukascopyチックデータをダウンロードしました。私はeasylzmaライブラリでデータを解凍しています。元の圧縮バイナリファイルには、我々は次の形式を取得し解凍した後EURUSD/2010/00/08/12h_ticks.bi5(EURUSD/2010 /イアン/ 8/12H)である:Dukascopyチックバイナリファイルからデータを読み取る

+-------------------------+--------+-------+ 
|   time   | Bid | Ask | 
+-------------------------+--------+-------+ 
000003CA 00022EC0 00022EB6 40CCCCCD 41180000 
000004F5 00022EB6 00022EB1 4099999A 404CCCCD 

(あなたは、元の圧縮ファイルをダウンロードすることができますFrom:。

int ii1; 
int ii2; 
int ii3; 
float ff1; 
float ff2; 
ifstream in("12h_ticks",ofstream::binary); 
in.read((char*)(&ii1), sizeof(int)); 
in.read((char*)(&ii2), sizeof(int)); 
in.read((char*)(&ii3), sizeof(int)); 
in.read((char*)(&ff1), sizeof(float)); 
in.read((char*)(&ff2), sizeof(float)); 
std::cout << " ii1=" << ii1 << std::endl; 
std::cout << " ii2=" << ii2 << std::endl; 
std::cout << " ii3=" << ii3 << std::endl; 
std::cout << " ff1=" << ff1 << std::endl; 
std::cout << " ff2=" << ff2 << std::endl; 
in.close(); 

私はFOを取得:バイナリファイルの読み取り 12h_ticks

EURUSD/2010/00/08/12h_ticks.bi5 LZMAでそれを解凍した後、我々はファイルを取得します結果を得られる:

ii1=-905773056 
ii2=-1070726656 
ii3=-1238498816 
ff1=-4.29492e+08 
ff2=8.70066e-42 

何が問題なのですか?バイナリファイルからデータを読み取ることができません。私を助けてください。

+0

が興味があるだけであるボリュームを掲載している入札*です*掲載し、この時間内秒です、どのようにファイル形式を把握しましたか? – user3833308

答えて

8

データは、ビッグエンディアン形式でファイルに格納されているようです。ロードするときにリトルエンディアンに変換する必要があります。

#include <iostream> 
#include <fstream> 
#include <algorithm> 

template<typename T> 
void ByteSwap(T* p) 
{ 
    for (int i = 0; i < sizeof(T)/2; ++i) 
     std::swap(((char *)p)[i], ((char *)p)[sizeof(T)-1-i]); 
} 

int main() 
{ 
    int ii1; 
    int ii2; 
    int ii3; 
    float ff1; 
    float ff2; 
    std::ifstream in("12h_ticks",std::ofstream::binary); 
    in.read((char*)(&ii1), sizeof(int)); 
    in.read((char*)(&ii2), sizeof(int)); 
    in.read((char*)(&ii3), sizeof(int)); 
    in.read((char*)(&ff1), sizeof(float)); 
    in.read((char*)(&ff2), sizeof(float)); 

    ByteSwap(&ii1); 
    ByteSwap(&ii2); 
    ByteSwap(&ii3); 
    ByteSwap(&ff1); 
    ByteSwap(&ff2); 

    std::cout << " ii1=" << ii1 << std::endl; 
    std::cout << " ii2=" << ii2 << std::endl; 
    std::cout << " ii3=" << ii3 << std::endl; 
    std::cout << " ff1=" << ff1 << std::endl; 
    std::cout << " ff2=" << ff2 << std::endl; 
    in.close(); 
    return 0; 
} 

これは結果を与える:

ii1=970 
ii2=143040 
ii3=143030 
ff1=6.4 
ff2=9.5 

あなたはその主題についての詳細を読みたい場合、私はここからBYTESWAP機能をつかみました。 How do I convert between big-endian and little-endian values in C++?

+0

はこのデータフォーマットはまだ有効ですか?あなたが知っている場合は入れてください。 – user3833308

+0

私はそれが正しく理解した場合、最初の16ビットは時間を表し、次の16ビットは次の16ビッド、次の32ビットは次の32ビットの入札ボリュームに尋ねます。 – user3833308

+0

ファイルの値が何を表しているのか分かりません。私はちょうどエンディアンの問題を認識しました。 –

5

II1は

II2は10000

II3が10000

FF1は

FF2は入札量

+1

ii1はミリ秒以内にあるようです。 – user2170324

+0

あなたはどのようにファイル形式をリバースエンジニアリングしましたか? – user3833308

関連する問題