用iostream操作符填充缓冲区
Fill a buffer with iostream operator
我想使用<<
运算符来填充外部缓冲区,
我已经尝试从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继承来做这些。
你要做的是编写你自己的流缓冲类,将它的数据发送到套接字或消息队列。
有各种套接字流类来演示如何做到这一点。它们中的许多(大多数?)都相当老了,因为流模型并不能很好地与套接字一起工作,但是如果您想尝试它,代码就在那里(包括源代码,因此它展示了如何自己做同样的事情—这实际上并不太难)。
相关文章:
- C++:使用缓冲区中的数据填充结构
- 深度缓冲区未填充阴影贴图渲染通道中的数据
- 缓冲区填充了不同类型的数据和严格的混叠
- DirectX11只绘制填充索引和顶点缓冲区中的一半顶点
- 填充和保存线程之间的共享缓冲区
- strcpy_s将超过字符串长度的字符串复制到目标缓冲区(用 0xFE 填充)
- 缓冲区用不需要的数据填充 char 数组中的最后一个空格
- InternetReadFile 填充缓冲区,但返回零字节读取
- 无法使用两种不同的频率填充 *.wav 文件的缓冲区
- P/调用C++用于填充托管缓冲区的 DLL
- 是否存在以相反顺序填充缓冲区的MEMSET函数
- FFMPEG挂在缓冲区填充C 上
- 在 C++ 中填充重复的自定义协议缓冲区字段
- C - 分配一个未签名的炭缓冲区,然后用字符串填充
- C/C++ 从字符缓冲区读取以填充结构
- 如果缓冲区由数据流填充,则 C++ boost async_read_some被缓冲区阻止
- 将额外的字节填充到要通过网络发送的flatbuffer的缓冲区指针
- 在本地将数据填充到recv缓冲区中
- 在 c++ 中使用消息结构读取/填充数据缓冲区的正确方法是什么?
- 从流和缓冲区填充矢量时会产生不同的结果