2012-12-26 13 views
6

Ho scaricato i dati tick Dukascopy e li ho decompressi con la libreria easylzma. Il file binario originale compresso è EURUSD/00/08/12h_ticks.bi5 (2010/EURUSD/ian/8/12h)/2010 Dopo la decompressione si ottiene il seguente formato: file diLettura dei dati dal file binario tick di Dukascopy

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

(È possibile scaricare originali compressi da:. EURUSD/2010/00/08/12h_ticks.bi5 Dopo la decompressione con LZMA otteniamo il file: 12h_ticks)

lettura del file binario:

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

ho la fo Risultato:

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

Cosa c'è che non va? Non riesco a leggere i dati dal file binario. Mi aiuti per favore.

+0

Solo curioso , Come hai capito il formato del file? – user3833308

risposta

8

I dati sembrano essere memorizzati nel formato big endian nel file. Dovrai convertirlo in little endian quando lo carichi.

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

Questo dà il risultato:

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

ho afferrato la funzione ByteSwap da qui se vuoi saperne di più su questo argomento. How do I convert between big-endian and little-endian values in C++?

+0

questo dataformat è ancora valido? incase se ti capita di saperlo. – user3833308

+0

se ho capito bene legge che i primi 16 bit rappresentano il tempo, i successivi 16 bit chiedono, la successiva 16 offerta, i successivi 32 bit chiedono il vol, il volume di offerta successivo di 32 bit, è corretto? – user3833308

+0

Non so nulla di ciò che rappresentano i valori nel file, ho appena riconosciuto un problema di endian. –

5

II1 è secondi in questa ora

II2 è Chiedi * 10000

II3 è un'offerta * 10000

FF1 è Chiedi Volume

FF2 è Rilancio Volume

+1

ii1 sembra essere millisecondi all'interno. – user2170324

+0

per curiosità come hai decodificato il formato del file? – user3833308