无法使用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
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