用iostream操作符填充缓冲区

Fill a buffer with iostream operator

本文关键字:缓冲区 填充 操作符 iostream      更新时间:2023-10-16

我想使用<<运算符来填充外部缓冲区,

我已经尝试从iostream继承,然后每次我使用<<到我的类,我复制的内容,到当前的缓冲区位置,并增加缓冲区位置…

我没有运气,我在网上找了一些例子或教程,但我有点迷路了。我如何使用类和重载<<操作符,将类型T的变量复制到缓冲区中??

方向吗?

我所拥有的类的概述:

class CBufferedMem
{
public:
    CBufferedMem(unsigned char* buffer, unsigned int size);
    char ReadFromBuffer(void* dst, unsigned char length);
    char writeToBuffer(void src, unsigned char length);
private:
    unsigned char* buffer;
    unsigned short buffSize;
    unsigned char* currentTmpLocation;
    unsigned char* endOfBuffer;
};

最简单的解决方案是直接使用一个特殊的缓冲类并重载所需的输出操作符:

struct buffer_class
{
    // The data needed...
};
inline buffer_class& operator<<(buffer_class& buffer, const std::string& s)
{
    // Code to add the string to the buffer
    return buffer;
}
inline buffer_class& operator<<(buffer_class& buffer, const uint8_t ub)
{
    // Code to add the value to the buffer
    return buffer;
}
inline buffer_class& operator<<(buffer_class& buffer, const int8_t sb)
{
    // Code to add the value to the buffer
    return buffer;
}

为所有需要的数据添加更多操作符重载。


例如,它可以像这样:

struct buffer_class
{
    std::vector<int8_t> data;
};
inline buffer_class& operator<<(buffer_class& buffer, const std::string& s)
{
    for (const auto& ch : s)
        buffer.data.push_back(static_cast<unt8_t>(ch));
    return buffer;
}
inline buffer_class& operator<<(buffer_class& buffer, const uint8_t ub)
{
    buffer.data.push_back(static_cast<int8_t>(ub));
    return buffer;
}
inline buffer_class& operator<<(buffer_class& buffer, const int8_t sb)
{
    buffer.data.push_back(sb);
    return buffer;
}

那么你可以这样使用:

buffer_class my_buffer;
buffer << std::string("Hello") << 123:
// The raw data can now be accessed by `my_buffer.data.data()`

你不会想要从iostream继承来做这些。

你要做的是编写你自己的流缓冲类,将它的数据发送到套接字或消息队列。

有各种套接字流类来演示如何做到这一点。它们中的许多(大多数?)都相当老了,因为流模型并不能很好地与套接字一起工作,但是如果您想尝试它,代码就在那里(包括源代码,因此它展示了如何自己做同样的事情—这实际上并不太难)。