2012-12-26 40 views
6

Tôi đã tải xuống dữ liệu đánh dấu Dukascopy và tôi đã giải nén nó bằng thư viện easylzma. Bản gốc nén tập tin nhị phân là EURUSD/2010/00/08/12h_ticks.bi5 (EURUSD/2010/ian/8/12h) Sau khi giải nén chúng ta có định dạng sau:Đọc dữ liệu từ Dukascopy đánh dấu tệp nhị phân

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

(Bạn có thể tải tập tin ban đầu nén từ:. EURUSD/2010/00/08/12h_ticks.bi5 Sau khi giải nén nó với LZMA chúng tôi nhận được tập tin: 12h_ticks)

Đọc các tập tin nhị phân:

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

tôi nhận được fo kết quả llowing:

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

Điều gì là sai? Tôi không thể đọc dữ liệu từ tệp nhị phân. Làm ơn giúp tôi.

+0

Chỉ cần tò mò , Bạn đã tìm ra định dạng tệp như thế nào? – user3833308

Trả lời

8

Dữ liệu dường như được lưu ở định dạng cuối lớn trong tệp. Bạn sẽ cần phải chuyển đổi nó để ít endian khi bạn tải nó.

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

này cho kết quả:

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

Tôi túm lấy chức năng ByteSwap từ đây nếu bạn muốn tìm hiểu thêm về chủ đề đó. How do I convert between big-endian and little-endian values in C++?

+0

là dữ liệu này vẫn hợp lệ? nếu bạn tình cờ biết. – user3833308

+0

nếu tôi hiểu chính xác nó đọc 16 bit đầu tiên đại diện cho thời gian, 16 bit tiếp theo hỏi, giá thầu 16 tiếp theo, 32 bit tiếp theo yêu cầu vol, khối lượng giá thầu 32 bit tiếp theo, đúng không? – user3833308

+0

Tôi không biết gì về những giá trị trong tệp đại diện, tôi vừa nhận ra một vấn đề cuối cùng. –

5

ii1 là giây trong giờ này

ii2 là Ask * 10000

ii3 là giá thầu * 10000

FF1 là Ask Khối lượng

FF2 là Khối lượng Bid

+1

ii1 dường như là mili giây bên trong. – user2170324

+0

vì tò mò về cách bạn định dạng tệp kỹ sư đảo ngược? – user3833308

Các vấn đề liên quan