有没有一种std::streambuf版本可以将主机字节顺序转换为网络字节顺序?

9

是否有类似于std::streambuf的机制来将多字节值转换为网络字节顺序?特别地,Boost Asio提供这样的原语吗?以下是我想要流缓冲区执行的示例:

uint64_t x = 42ull;
network_streambuf b1;
std::ostream os(&b1);
os << 42ull; // htonll

network_streambuf b2;
std::istream is(&b2);
uint64_t y;
is >> y; // ntohll

编辑:答案表明,这种思考问题的方式是错误的:流缓冲区仅提供对字符序列的访问,它们的工作不是执行格式化I/O或转换。我可能会实现一个小缓冲区类,为operator<<operator>>提供必要的重载以执行转换。


如果您在示例中定义了b2,那么您的问题将更有意义。此外,为什么operator<<(…, unsigned long long)会调用htons?难道不应该调用htonll吗? - Robᵩ
谢谢Rob,我已经修正了这些bug。 - mavam
3
我认为你正在错误的地方寻找解决方案。当格式化程序(ostream)完成后,它会将字节流传递给streambuf。听起来你实际上想要一个“二进制”的ostream,如果你正试图解决输出数字的字节顺序问题。 - CB Bailey
1个回答

7
不可以。我会告诉你为什么。
istream::operator>>和ostream::operator<<作用于字符流,将它们从人类可读的形式转换成计算机的本地形式。streambuf根本不参与这种转换,除了提供(或接受)一串字符流。
换句话说,格式化I/O例程将字符形式转换为二进制形式。
您要求将一种二进制形式转换为另一种二进制形式。这不是同一件事情,而且stream格式文本例程是错误的地方。
话虽如此,您可以创建自己的类来实现operator<<和operator>>,并让这些例程执行网络字节交换。

1
然而,这是一种常见的模式,特别是在网络编程中。是否有提供类似服务的库? - Aviad Rozenhek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接