如何在读取包头并找出包长度后正确遍历包?

问题描述 投票:0回答:1

鉴于此标题格式:

我正在尝试遍历并打印 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);
}

我做错了什么,还是数据不准确?

c++ ifstream binary-data
1个回答
0
投票

回答:我漏掉了一个重要的细节:“所有数据都是按网络字节顺序排列的。” 因此,正确的代码是:

#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 指出这一点。

© www.soinside.com 2019 - 2024. All rights reserved.