2012-12-26 14 views
6

Ich habe die Dukascopy-Tick-Daten heruntergeladen, und ich habe es mit easylzma Bibliothek dekomprimieren. Die ursprüngliche komprimierte Binärdatei ist EURUSD/2010/00/08/12h_ticks.bi5 (EURUSD/2010/ian/8/12h) Nach dem Dekomprimieren wir das folgende Format erhalten:Lesen von Daten aus Dukascopy Tick-Binärdatei

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

(Sie original komprimierte Datei herunterladen von:. EURUSD/2010/00/08/12h_ticks.bi5 Nachdem es mit lzma Dekomprimieren bekommen wir die Datei: 12h_ticks)

die Binärdatei Lesen:

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(); 

bekomme ich die fo llowing Ergebnis:

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

Was ist falsch? Ich kann keine Daten aus einer Binärdatei lesen. Bitte hilf mir.

+0

Nur neugierig Wie haben Sie das Dateiformat herausgefunden? – user3833308

Antwort

8

Die Daten scheinen im Big-Endian-Format in der Datei gespeichert zu sein. Sie müssen es in Little Endian konvertieren, wenn Sie es laden.

#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; 
} 

Dies gibt das Ergebnis:

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

ich die byteswap Funktion griff von hier, wenn Sie mehr über dieses Thema lesen möchten. How do I convert between big-endian and little-endian values in C++?

+0

ist dieses Datenformat noch gültig? falls du es zufällig weißt. – user3833308

+0

wenn ich es richtig verstanden habe, liest es zuerst 16 Bits stellt Zeit dar, nächste 16 Bits fragen, nächstes 16 Gebot, nächste 32 Bits fragen vol, nächste 32 Bits Gebotvolumen, ist das richtig? – user3833308

+0

Ich weiß nichts darüber, was die Werte in der Datei darstellen, ich habe gerade ein Endian-Problem erkannt. –

5

II1 ist Sekunden innerhalb dieser Stunde

II2 Frage * 10000

II3 ist Bid * 10000

FF1 Volume Stellen Sie

FF2 Bid Volume

+1

ii1 scheint Millisekunden innerhalb sein. – user2170324

+0

aus Neugier, wie haben Sie das Dateiformat Reverse Engineering? – user3833308