我正在尝试将4字节标头添加到现有的std::stringbuf
对象中。例如,如果stringbuf中的数据为‘h’,’e’,’l’,’l’,’o’
且标头为‘0x00’,’0x10’, ‘0x00’,’0x0a’
,那么我需要将stringbuf更改为‘0x00’,’0x10’, ‘0x00’,’0x0a’, ‘h’,’e’,’l’,’l’,’o’
。
我一直在尝试以下方法,但它是无效的,因为它在sbuf
,TextStream
和buff中有三个数据副本。使用new char[]
更有问题,因为它需要连续的内存块,而且我可以拥有非常大的流。
有人可以通过向我展示如何以更优化的方式做到这一点来帮助我吗?我的意思是有没有办法在现有的stringbuf之前预先添加字节?
std::stringbuf CreateStreamWithHeader(std::stringbuf &sbuf)
{
int i = sbuf.str().size();
std::stringbuf TextStreambuf;
uint32_t streamsize = sbuf.str().size();
char* buff = new char [streamsize + 5]; //Using char buffer is not memory efficient as it needs a big contonuous chunk of memory.
ZeroMemory(buff, (streamsize + 5)*sizeof(char));
buff[0] = (streamsize >> 24) & 0xFF; //In my case header needs to contain size of data in sbuf
buff[1] = (streamsize >> 16) & 0xFF;
buff[2] = (streamsize >> 8) & 0xFF;
buff[3] = (streamsize >> 0) & 0xFF;
strcpy(&buff[4], sbuf.str().c_str()); //strcpy is not the right solution because it will fail if there’s a NULL character in sbuf
memcpy(&buff[4], sbuf.str().c_str(), streamsize);
TextStreambuf.sputn(buff, streamsize + 4);
delete []buff;
return TextStreambuf;
}
int _tmain(int argc, _TCHAR* argv[])
{
std::stringbuf stringbuffer, finalstringbuffer;
stringbuffer.sputn("This is a some string for testing", 33);
finalstringbuffer = CreateStreamWithHeader(stringbuffer);
return 0;
}
答案 0 :(得分:0)
你可以而且应该在没有预先支出的情况下这样做: