Writing uin32_t to asio::streambuf
Writing uin32_t to asio::streambuf
我正在尝试将uint32_t
写入我将要通过网络发送的缓冲区,但我不确定如何正确执行此操作。最初,我假设operator<<
会正确处理它并将 4 个字节写入缓冲区(假设我以前使用过htonl
(。相反,我开始得到没有任何意义的值。我注意到了这一点,有时有时将单个 int 写入流有时会将缓冲区的大小增加多达 10 个字节,而不是预期的四个字节。我写了一个简短的测试,并意识到它实际上是将ascii中的整数转储到缓冲区中。我想我已经找到了解决方法,但它感觉很黑客,所以我正在寻找更好的方法,或者为什么我正在做的事情实际上是正确的理由。
下面是一些示例代码:
boost::asio::streambuf buffer;
std::ostream os(&buffer);
uint32_t value = 0x12345678;
os << value; // Gives ascii 305419896
os.write((const char *) &value, sizeof(value)); // fives 0x12345678
有没有比我的最后一行代码更好的方法?
你正在做的很好,但可以直接写到 streambuf :
buffer.commit(boost::asio::buffer_copy(
buffer.prepare(sizeof(value)),
boost::asio::buffer(&value, sizeof(value))));
这是通常的做法。如果在两者之间添加一些代码,则可以节省一些时间和代码。
template<class T> void append(T value)
{
static_assert(std::is_fundamental<T>::value, __FUNCTION__);
//Convert here to correct endian
append(reinterpret_cast<const char*>(&value), sizeof(value));
}
template<class T> void append(const T *app, std::size_t size)
{
return append(reinterpret_cast<const char*>(app), size);
}
void append(const char *s, std::size_t length)
{
//append to buffer
}
请记住在收到数据时转换为正确的字节序。或者,如果您知道远程计算机的期望,请直接以正确的格式发送它。
您也可以像这样检查字节序:
static bool IsBigEndian(void)
{
union
{
uint32_t i;
char c[4];
} endi = { 0x01020304 };
return endi.c[0] == 1;
}
相关文章:
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- Writing uin32_t to asio::streambuf
- Boost::asio::streambuf consumption() 不清空缓冲区
- 将 std::string 转换为 boost::asio::streambuf
- Boost ASIO ForwardIterator for streambuf
- boost::asio::streambuf::consume-注入垃圾字符
- 从boost asio streambuf读取会将字节保持在缓冲区中
- 如何访问boost :: asio :: streamBuf输入作为字符串
- 如何复制或重复使用boost :: asio :: streambuf
- boost::asio::streambuf-如何重用缓冲区
- BOOST :: ASIO :: StreamBuf收缩到合适
- Working with boost::asio::streambuf
- 如何将 boost::asio::streambuf 转换为浮点数
- 将数据从 boost::asio::streambuf 复制到 std::string
- 缺少使用boost::asio::streambuf的第一个字符
- 读取直到boost::asio::streambuf中的字符串分隔符
- boost::asio::streambuf with wchar_t
- 如何手动将数据放入boost::asio::streambuf中,以便稍后使用std::istream读取
- asio::streambuf to std::istream 丢弃新行
- Boost::asio::streambuf通过https检索XML数据