ASIO写入的十六进制字符串到字节

时间:2016-04-15 02:47:33

标签: c++ boost-asio

我使用以下代码写入我的串行设备,其中十六进制表示为data = "\x35\x0d"(即5并且回车):

    boost::asio::write(
        *serial_port,
        boost::asio::buffer(data.c_str(), data.size()), 
        boost::asio::transfer_at_least(data.size()),
        error
    );

我怎样才能转换字符串" 350d"到一个字节串用于写入我的串口?并非所有命令都是硬编码的。谢谢。

2 个答案:

答案 0 :(得分:1)

这里有一些代码我在一段时间后一起扔了一个我正在研究的简单工具。这包含两个方向的转换。它不是唯一的方式,但它是单向的。

// Convert binary data to hex string
std::string to_hex( const std::vector<uint8_t> & data )
{
  std::ostringstream oss;
  oss << std::hex << std::setfill('0');
  for( uint8_t val : data )
  {
    oss << std::setw(2) << (unsigned int)val;
  }
  return oss.str();
}

// Convert hex string to binary data
std::vector<uint8_t> from_hex( const std::string & s )
{
  std::vector<uint8_t> data;
  data.reserve( s.size() / 2 );
  std::istringstream iss( s );
  iss >> std::hex;
  char block[3] = {0};
  while( iss.read( block, 2 ) )
  {
    uint8_t val = std::strtol( block, NULL, 16 );
    data.push_back( val );
  }
  return data;
}

您需要各种标题:<cstdint><iomanip><sstream><string><vector>

答案 1 :(得分:0)

这个功能对我有用:

std::string hex_str_to_binary(std::string hex_str) 
{
    std::string binary_str, extract_str;

    try
    {
        assert(hex_str.length() % 2 == 0);  // throw exception if string length is not even
        binary_str.reserve(hex_str.length()/2);
        for (std::string::const_iterator pos = hex_str.begin(); pos < hex_str.end(); pos += 2)
        {
            extract_str.assign(pos, pos + 2);
            binary_str.push_back(std::stoi(extract_str, nullptr, 16));
        }
    }
    catch (const std::exception &e)
    {
        std::cerr << "e.what() = " << e.what();
        throw -1;
    }

    return binary_str;
}

hex_str看起来像“350d”。我使用小写字母,确保你的字符串长度均匀,填充空格为0。然后使用此字符串进行asio write:

    boost::asio::write(
        *serial_port,
        boost::asio::buffer(binary_str.c_str(), binary_str.size()), 
        boost::asio::transfer_at_least(binary_str.size()),
        error
    );