鉴于此标题格式:
我正在尝试遍历并打印 Length 和 Num Market Updates:
std::ifstream fileOpener(m_rawInputFileName, std::ios::binary);
if (!fileOpener.is_open())
{
std::cout << "Error: could not open file" << std::endl;
fileOpener.close();
return;
}
short int packetLength;
short int numOfMarketUpdates;
while (fileOpener.read((char *)&packetLength, 2) &&
fileOpener.read((char *)&numOfMarketUpdates, 2))
{
cout << packetLength << ":" << numOfMarketUpdates << endl;
fileOpener.seekg(-4, std::ios::cur);
fileOpener.seekg(packetLength, std::ios::cur);
}
我做错了什么,还是数据不准确?
回答:我漏掉了一个重要的细节:“所有数据都是按网络字节顺序排列的。” 因此,正确的代码是:
#include <arpa/inet.h>
std::ifstream fileOpener(m_rawInputFileName, std::ios::binary);
if (!fileOpener.is_open())
{
std::cout << "Error: could not open file" << std::endl;
return;
}
short int packetLength;
short int numOfMarketUpdates;
while (fileOpener.read((char *)&packetLength, 2) &&
fileOpener.read((char *)&numOfMarketUpdates, 2))
{
packetLength = nthos(packetLength);
numOfMarketUpdates = nthos(numOfMarketUpdates);
cout << packetLength << ":" << numOfMarketUpdates << endl;
fileOpener.seekg(-4, std::ios::cur);
fileOpener.seekg(packetLength, std::ios::cur);
}
nthos 将网络字节顺序转换为主机字节顺序。网络字节顺序配置为 big-endian,这可能与您的主机字节顺序不同,因此除非您将其转换为主机字节顺序,否则它没有意义。
感谢 user253751 指出这一点。