C++ 为什么boost::asio::ip::tcp::iostream解析输入?

C++ 为什么boost::asio::ip::tcp::iostream解析输入?,c++,boost-asio,C++,Boost Asio,我尝试使用boost ASIO中的iostream类从TCP套接字读取二进制数据。我使用标准提取操作符(操作符>>)从流中读取数据。我使用的环境是VisualStudio2010。 问题是,当我读取流时,流似乎试图将二进制数据解析为字符串。至少我在调试代码时看到了这一点 有没有一种方法可以使用iostream将其作为二进制流而不是字符串流读取 boost::asio::io_service dataServer; boost::asio::ip::tcp::endpoint dataServe

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

有没有一种方法可以使用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;
boost::asio::io_服务数据服务器;
boost::asio::ip::tcp::endpoint dataServerEndpoint(boost::asio::ip::tcp::v4(),dataServerPort);
boost::asio::ip::tcp::acceptor-acceptor(数据服务器,数据服务器端点);
boost::asio::ip::tcp::iostream dataServerStream;
acceptor.accept(*dataServerStream.rdbuf());
尝试
{
矢量线缓冲器;
而(!dataServerStream.eof())
{
bool eof=dataServerStream.eof();
bool bad=dataServerStream.bad();
bool fail=dataServerStream.fail();
bool good=dataServerStream.good();
uint64_t魔术;
数据服务器流>>魔术;

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

输入运算符
>
希望输入为文本,然后转换为正确的数据类型。正如您所料,这对二进制数据不起作用

您应该改为使用:


输入运算符
>
希望输入为文本,然后将其转换为正确的数据类型。正如您所预料的,这将无法很好地处理二进制数据

您应该改为使用:

uint64_t magic;
dataServerStream.read(reinterpret_cast<char*>(&magic), sizeof(magic));
uint64_t magic;
while (dataServerStream.read(reinterpret_cast<char*>(&magic), sizeof(magic)))
{
    // Read the rest
}