0

我尝试使用 boost ASIO 的 iostream 类从 TCP 套接字读取二进制数据。我使用标准提取运算符(运算符>>)从流中读取数据。我使用的环境是 Visual Studio 2010。问题是当我读取流时,流似乎试图将二进制数据解析为字符串。至少这是我在调试代码时所看到的。

有没有办法可以使用 iostream 将其作为二进制流而不是字符串流读取?

boost::asio::io_service dataServer;

boost::asio::ip::tcp::endpoint dataServerEndpoint(boost::asio::ip::tcp::v4(), dataServerPort);
boost::asio::ip::tcp::acceptor acceptor(dataServer, dataServerEndpoint);

boost::asio::ip::tcp::iostream dataServerStream;
acceptor.accept(*dataServerStream.rdbuf());

try
{
    vector<char> lineBuffer;

    while (!dataServerStream.eof())
    {

        bool eof = dataServerStream.eof();
        bool bad = dataServerStream.bad();
        bool fail = dataServerStream.fail();
        bool good = dataServerStream.good();

        uint64_t magic;
        dataServerStream >> magic;

因此,它不只是从流中获取 8 个字节并将其移动到“魔术”变量中,而是尝试解析流以获取有效的字符串化数字。这当然会失败,并且会设置失败位。

4

1 回答 1

3

输入运算符>>期望输入是文本,然后将其转换为正确的数据类型。正如您所料,这不适用于二进制数据。

您应该read改用:

uint64_t magic;
dataServerStream.read(reinterpret_cast<char*>(&magic), sizeof(magic));

您还犯了一个非常常见的初学者错误,即循环while (!eof). 这将不起作用,因为在您尝试输入操作之后eof才会设置标志。这意味着您将迭代一次到多次。

相反,例如

uint64_t magic;
while (dataServerStream.read(reinterpret_cast<char*>(&magic), sizeof(magic)))
{
    // Read the rest
}
于 2013-04-15T08:54:52.403 回答