Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用istream从boost::asio UDP套接字检索浮点_C++_Sockets_Boost_Udp_Boost Asio - Fatal编程技术网

C++ 使用istream从boost::asio UDP套接字检索浮点

C++ 使用istream从boost::asio UDP套接字检索浮点,c++,sockets,boost,udp,boost-asio,C++,Sockets,Boost,Udp,Boost Asio,tl;dr我无法从使用boost asio UDP套接字接口填充的boost::streambuf创建的istream中读取浮动。我的数据似乎已损坏或处理不正确 我目前正在编写一个接口来实现DIS(分布式交互仿真)协议。我使用boost::asio库打开UDP套接字并接收数据。我正在正确地将数据从电线上拉到streambuf中,但我无法读取浮动 套接字代码: boost::asio::streambuf streamBuf; boost::asio::streambuf::mutable_buf

tl;dr我无法从使用boost asio UDP套接字接口填充的boost::streambuf创建的istream中读取浮动。我的数据似乎已损坏或处理不正确

我目前正在编写一个接口来实现DIS(分布式交互仿真)协议。我使用boost::asio库打开UDP套接字并接收数据。我正在正确地将数据从电线上拉到streambuf中,但我无法读取浮动

套接字代码:

boost::asio::streambuf streamBuf;
boost::asio::streambuf::mutable_buffers_type buf = streamBuf.prepare(maxSize);

udp::endpoint senderEndpoint;
size_t packetLength;

try {
    packetLength = sock.receive_from(buf, senderEndpoint);
    streamBuf.commit(packetLength);
} catch(boost::system::system_error se) {
    std::cout << "ERROR: " << se.what() << std::endl;
}
std::istream stream(&streamBuf);
现在,我已经为我需要的每种数据类型编写了类似的函数(主要是uint8_t-uint32_t)

解析PDU

//--Entity ID
    entityState.entityID.siteID = readUInt16(stream);
    entityState.entityID.appID = readUInt16(stream);
    entityState.entityID.entityID = readUInt16(stream);
...etc, etc.
//--Entity Linear Velocity
    entityState.entityLinearVelocity.x = readFloat32(stream);
    entityState.entityLinearVelocity.y = readFloat32(stream);
    entityState.entityLinearVelocity.z = readFloat32(stream);
...etc, etc.
我试图解析的数据看起来像最后的照片。我可以很好地解析所有内容,但是当我到达由3个32位浮点数组成的“实体线性速度”块时,我的数据就错了。使用wireshark,我已确认正确的btyestream正在通过线路发送

对于速度,我发送这一系列字节:42 74 aa 97 c2 80 b3 8f 42 e2 dc 54

42 74 aa 97 c2 80 b3 8f 42 e2 dc 54 等于61.166592、-64.350700和113.430328。但是,我的应用程序将其读取为42 72 FFFFFF AA FFFFFF 97 FFFFFF C2 FFFFFF 80 FFFFFF B3 FFFFFFFF 8F 42 FFFFFF E2 FFFFFFFF DC 54

42 72 ffffffaa ffffff97 ffffffc2 ffffff80 ffffffb3 ffffff8f 42 ffffffe2 ffffffdc 54 我的浮动最终是-1.10153e-24、-1.77004e-29和7.58951e+12

有人知道为什么我可以使用这个实现读取各种大小的UINT,但是浮点没有任何意义吗


这可能是由于耐久性问题。使用测试时,以下代码可以正常工作

std::string bin = {'\x42', '\x74', '\xaa', '\x97'};
std::istringstream raw(bin);
通过字节切换,即
ntohl

float readFloat32(std::istream& stream) {
    union {
       float fval;
       uint32_t ival;
    } ret;
    stream.read((char*)&ret, sizeof(float));
    ret.ival = ntohl(ret.ival);
    return ret.fval;
}
添加byteswapping后,
readFloat
返回的值为
61.1666

float readFloat32(std::istream& stream) {
    union {
       float fval;
       uint32_t ival;
    } ret;
    stream.read((char*)&ret, sizeof(float));
    ret.ival = ntohl(ret.ival);
    return ret.fval;
}