如何将 boost::asio::streambuf 转换为浮点数

How can I convert boost::asio::streambuf to float?

本文关键字:转换 浮点数 streambuf asio boost      更新时间:2023-10-16

我正在从串行端口读取数据。我已经设法获得了端口设置,并且可以读取缓冲区,但是我不知道如何将缓冲区保存的数据转换为浮点数。

float Serial::ReadData()
{
    boost::asio::streambuf buff;
    int bytesRead = read_until(*port, buff, "n");
    boost::asio::const_buffers_1 constBuff = buff.data();
    char*data = nullptr;
    int pos = 0;
    for (auto buffer = constBuff.begin(); buffer != constBuff.end(); buffer++)
    {
        data[pos] = reinterpret_cast<char>(buffer);
        pos++;
    }
    buff.consume(bytesRead);
    return atof(data);
}

或者

住在科里鲁

目前,它可能看起来几乎等效,但是:

  • 它不会泄漏内存
  • 它不会不必要地复制缓冲区
  • 它处理错误
  • 如果您想解析超过 1 件事,它会更加灵活
#include <boost/asio.hpp>
#include <iostream>
#include <stdexcept>
struct Serial {
    float ReadData();
    boost::asio::serial_port* port = nullptr;
};
float Serial::ReadData()
{
    boost::asio::streambuf buff;
    /*int bytesRead = */read_until(*port, buff, "n");
    std::istream is(&buff);
    float f;
    if (is >> f)
        return f;
    throw std::invalid_argument("ReadData");
}
int main(){}

好吧,我想出了该怎么做。这比我最初想象的要简单得多。

float Serial::ReadData()
{
    boost::asio::streambuf buff;
    int bytesRead = read_until(*port, buff, "n");
    char*data = new char[bytesRead];
    buff.sgetn(data, bytesRead);
    return atof(data);
}