Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用C+;正确解析二进制文件+;文件流 我试图用C++解析纳斯达克协议数据转储。这些是大文件,供感兴趣的人使用:_C++_Parsing_Binary_Ifstream - Fatal编程技术网

无法使用C+;正确解析二进制文件+;文件流 我试图用C++解析纳斯达克协议数据转储。这些是大文件,供感兴趣的人使用:

无法使用C+;正确解析二进制文件+;文件流 我试图用C++解析纳斯达克协议数据转储。这些是大文件,供感兴趣的人使用:,c++,parsing,binary,ifstream,C++,Parsing,Binary,Ifstream,这些文件的规格归结为: 一种两字节的大端长度,表示数据包其余部分的长度 指示类型的单字节ASCII报头 可变长度有效负载(大小:长度-1) 为了确保下载的文件内容正常,我使用python缓冲gzip阅读器在python中进行了快速检查。内容将按预期进行分析: bin_data = gzip.open('01302020.NASDAQ_ITCH50.gz', 'rb') message_size_bytes = bin_data.read(2) message_size = int.from_by

这些文件的规格归结为:

  • 一种两字节的大端长度,表示数据包其余部分的长度
  • 指示类型的单字节ASCII报头
  • 可变长度有效负载(大小:长度-1)
  • 为了确保下载的文件内容正常,我使用python缓冲gzip阅读器在python中进行了快速检查。内容将按预期进行分析:

    bin_data = gzip.open('01302020.NASDAQ_ITCH50.gz', 'rb')
    message_size_bytes = bin_data.read(2)
    message_size = int.from_bytes(message_size_bytes, byteorder='big', signed=False)
    message_type = bin_data.read(1).decode('ascii')
    record = bin_data.read(message_size - 1)
    print("size: " + str(message_size) + " type: " + message_type)
    # >>> size: 12 type: S
    
    在这种特殊情况下,消息大小打印为12,这是正确的值。以下字符S也是正确的

    但是,我自己使用std::ifstream复制正确python解析行为的尝试都失败了。我甚至无法正确读取前2个字节(这应该表示剩余有效负载的总大小为12)。以下是我的一些尝试,在这一点上,有些只是向黑暗中射击:

    #include <iostream>
    #include <fstream>
    
    int main() {
    std::string filepath = "/Users/estebanlanter/Documents/Finance/HFT/01302020.NASDAQ_ITCH50.gz";
    std::ifstream ifs;
    ifs.open(filepath, std::ifstream::in);
    std::cout<<"open...."<<std::endl;
    
    // trial A
    ifs.clear();
    ifs.seekg(0);
    int size_a;
    ifs.read(reinterpret_cast<char*>(&size_a), 2);
    std::cout<<"size: "<<size_a<<std::endl;
    // size: 325683999   
    
    // trial B
    ifs.clear();
    ifs.seekg(0);
    int size_b;
    ifs.read(reinterpret_cast<char*>(&size_b), 2);
    size_b = ntohl(size_b);
    std::cout<<"size: "<<size_b<<std::endl;
    // size: 529203200   
    
    // trial C
    ifs.clear();
    ifs.seekg(0);
    int size_c;
    ifs.read(reinterpret_cast<char*>(&size_c), 2);
    size_c = ntohs(size_c);
    std::cout<<"size: "<<size_c<<std::endl;
    // size: 8075   
    
    // trial D
    ifs.clear();
    ifs.seekg(0);
    uint8_t size_d;
    ifs.read(reinterpret_cast<char*>(&size_d), 2);
    std::cout<<"size: "<<size_d<<std::endl;
    // size:   
    
    // trial E
    ifs.clear();
    ifs.seekg(0);
    uint8_t size_e;
    ifs.read(reinterpret_cast<char*>(&size_e), 2);
    size_e = ntohl(size_e);
    std::cout<<"size: "<<size_e<<std::endl;
    // size: 
    
    
    // trial F
    ifs.clear();
    ifs.seekg(0);
    uint8_t size_f;
    ifs.read(reinterpret_cast<char*>(&size_f), 2);
    size_f = ntohs(size_f);
    std::cout<<"size: "<<size_f<<std::endl;
    // size: 
    
    
    
    // trial G
    ifs.clear();
    ifs.seekg(0);
    char size_g;
    ifs.read(&size_g, 2);
    std::cout<<"size: "<<size_g<<std::endl;
    // size: 
    
    // trial H
    ifs.clear();
    ifs.seekg(0);
    char size_h;
    ifs.read(&size_h, 2);
    size_h = ntohl(size_h);
    std::cout<<"size: "<<size_h<<std::endl;
    // size: 
    
    // trial I
    ifs.clear();
    ifs.seekg(0);
    char size_i;
    ifs.read(&size_i, 2);
    size_i = ntohs(size_i);
    std::cout<<"size: "<<size_i<<std::endl;
    // size: 
    
    #包括
    #包括
    int main(){
    std::string filepath=“/Users/estebanlanter/Documents/Finance/HFT/0130220.NASDAQ_ITCH50.gz”;
    std::ifstream-ifs;
    打开(文件路径,std::ifstream::in);
    
    std::cout@退休忍者正确地指出文件是gzip,这是错误的根源。我基本上只是错误地掩盖了一个事实,即在python中我调用了一个特定于gzip的io读取器。解压缩文件后,我可以正确地解析第一个字节。

    不要使用
    std::ifstream::in
    ,使用
    std::ios::bi而不是
    。此外,当您读取值并将其存储到
    int
    中时,大小将是
    4
    ,而不是
    2
    。从规范中我知道,二进制文件中的每条消息都以…“一个两字节的big-endian长度开始,表示数据包其余部分的长度”。您的int size是正确的,但是我尝试用2字节的短字符和无符号的短字符替换所有int,但仍然没有正确解析的输出。同时标记std::ios::binary。您是否更改为
    std::ios::binary
    ?是的,我替换了该标记并用无符号的短字符替换int。我的控制台现在打印35615。它的幸运的是,我还没有看到12个正在读取的GZIP文件。C++中没有自动解压缩文件,你必须先解压缩文件,或者使用ZLIB和<代码> GZOPEN//COD> <代码> GZRead < /C> > 35516。
    std::string filepath = "/Users/estebanlanter/Documents/Finance/HFT/01302020.NASDAQ_ITCH50.gz";
    std::ifstream ifs;
    ifs.open(filepath, std::ios::binary);
    
    
    std::cout<<"open...."<<std::endl;
    
    
    ifs.clear();
    ifs.seekg(0);
    unsigned short size_a;
    ifs.read(reinterpret_cast<char*>(&size_a), 2);
    std::cout<<"size: "<<size_a<<std::endl;
    // size: 35615    
    
    
    ifs.clear();
    ifs.seekg(0);
    short size_b;
    ifs.read(reinterpret_cast<char*>(&size_b), 2);
    std::cout<<"size: "<<size_b<<std::endl;
    // size: -29921
    
    int main() {
    std::string filepath = "/Users/estebanlanter/Documents/Finance/HFT/01302020.NASDAQ_ITCH50.gz";
    std::ifstream ifs;
    ifs.open(filepath, std::ios::binary);
    
    
    std::cout<<"open...."<<std::endl;
    
    
    ifs.clear();
    ifs.seekg(0);
    uint16_t size_a;
    ifs.read(reinterpret_cast<char*>(&size_a), 2);
    std::cout<<"size: "<<size_a<<std::endl;
    // size: 35615