Есть ли способ добавить фиксированное количество байтов до std :: stringbuf?

105
15

Im пытается добавить 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 theres 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;
}

спросил(а) 2017-08-14T19:31:00+03:00 3 года, 5 месяцев назад
1
Решение
119

Вы можете и должны делать это, никогда не добавляя:

Запись позиции streambuf Ищите вперед или записывайте заполнитель правильного размера Напишите другие данные. Вернитесь к началу. Замените заполнитель с конечным значением.

ответил(а) 2017-08-15T06:25:00+03:00 3 года, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема