2012-12-26 14 views
6

Pobrałem dane kleszczy Dukascopy i dekompresowałem je za pomocą biblioteki easylzma. Oryginalny skompresowany plik binarny jest EURUSD/00/08/12h_ticks.bi5 (EURUSD Ian/8/12h/2010 /) Po dekompresji otrzymujemy następujący format/2010:Odczytywanie danych z pliku binarnego kleszcza Dukascopy

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

(Można pobrać oryginalny plik skompresowany z:. EURUSD/2010/00/08/12h_ticks.bi5 Po dekompresji go LZMA otrzymujemy plik: 12h_ticks)

odczytu pliku binarnego:

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

dostaję FO llowing result:

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

Co jest nie tak? Nie mogę odczytać danych z pliku binarnego. Proszę pomóż mi.

+0

Wystarczy ciekawy , Jak poznałeś format pliku? – user3833308

Odpowiedz

8

Dane wydają się być zapisane w pliku w formacie big endian. Po załadowaniu musisz go przekonwertować na małego endiana.

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

To daje wynik:

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

Złapałam funkcję ByteSwap tutaj, jeśli chcesz dowiedzieć się więcej o tym temacie. How do I convert between big-endian and little-endian values in C++?

+0

czy ten format danych jest nadal ważny? gnieść, jeśli wiesz. – user3833308

+0

jeśli zrozumiałem to poprawnie, odczytuje pierwsze 16 bitów reprezentuje czas, następne 16 bitów pyta, następne 16 ofert, następne 32 bity pyta vol, następne 32 bity wolą licytacji, czy to prawda? – user3833308

+0

Nie wiem nic o tym, co przedstawiają wartości w pliku, właśnie rozpoznałem problem z endianami. –

5

II1 jest sekund w ciągu tej godziny

II2 to poprosić * 10000

II3 jest Bid * 10000

ff1 to poprosić Volume

FF2 jest Bid Volume

+1

ii1 wydaje się być w milisekundach. – user2170324

+0

z ciekawości, w jaki sposób odtwarzałeś format pliku? – user3833308

Powiązane problemy