c++ - 用于 ASIO 写入的十六进制字符串到字节

标签 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”转换为字节字符串以用于写入我的串行端口?并非我的所有命令都将被硬编码。谢谢。

最佳答案

这是我不久前为我正在开发的一个简单工具拼凑的一些代码。这包含双向转换。这不是唯一的方式,但这是一种方式。

// 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;
}

您需要各种 header :<cstdint> , <iomanip> , <sstream> , <string> , <vector> .

关于c++ - 用于 ASIO 写入的十六进制字符串到字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36637427/

相关文章:

c++ - 在 LINUX C++ 中获取模块名称和进程名称

c++ - 类引用成员指向同一类中的其他成员

c++ - 如何使用 Windows API 获取 "cryptographically strong"随机字节?

c++ - connect() 后 boost 异常

c++ - 为什么 boost 服务器类抛出运行时错误

boost-asio - 应该如何拆除 boost::asio::ip::udp::socket?

c++ - 如何使用 move 语义迭代器和模板

c++ - 没有显式构造函数的结构中的错误 C2512

c++ - 使用带有 boost::asio 异步操作的自定义 streambuf

c++ - 使用Boost野兽和openssl的async_handshake发生内存泄漏