C中是否有二进制内存流

新手上路,请多包涵

我通常使用 stringstream 写入内存字符串。有没有办法以二进制模式写入字符缓冲区?考虑以下代码:

 stringstream s;
s << 1 << 2 << 3;
const char* ch = s.str().c_str();

ch 的内存将如下所示: 0x313233 - 字符 1、2 和 3 的 ASCII 码。我正在寻找一种自己编写二进制值的方法。也就是说,我希望内存中有 0x010203。问题是我希望能够编写一个函数

void f(ostream& os)
{
    os << 1 << 2 << 3;
}

并决定外部使用哪种流。像这样的东西:

 mycharstream c;
c << 1 << 2 << 3; // c.data == 0x313233;
mybinstream b;
b << 1 << 2 << 3; // b.data == 0x010203;

有任何想法吗?

原文由 FireAphis 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 570
1 个回答

我真的很喜欢韩洛的方法,并且已经验证了它的效果很好!如果将 oss 成员变量更改为使用 std::stringstream (与 ostringstream 相比) ,该类也可用于使用重载流提取运算符进行提取,如下所示:

     template <typename T, typename std::enable_if<std::is_fundamental<T>::value, bool>::type = true>
    bostringstream& operator>> (T& v)
    {
        char buffer[sizeof(T)];
        oss.read(buffer, sizeof(T));
        v = *(T*)buffer;
        return *this;
    }

示例模板支持整数类型,如果为 std::is_compound 添加新模板,则还可以支持 std::map 等类型。对于 std::vector 之类的东西,即“is_fundemental”,我建议先将大小推送到流中,因此在提取端可以拉出它以了解之后要拉出多少元素。这种方法可以很好地与常见的 std::vector 和 std::map 类型一起使用。

原文由 James Killian 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏