Я пытаюсь использовать istringstream
для восстановления закодированного wstring
из некоторой памяти. Память раскладывается следующим образом:
- 1 байт, чтобы указать начало кодирования wstring. Произвольно это «!».
- n байтов для хранения длины символа в текстовом формате, например 0x31, 0x32, 0x33 будет "123", то есть строка из 123 символов
- 1 байт-разделитель (пробел)
- n байтов, которые представляют собой wchars, составляющие строку, где wchar_t - 2 байта каждый.
Например, последовательность байтов:
21 36 20 66 00 6f 00 6f 00
- это "! 6 f.o.o." (используя точки для обозначения символа 0)
Все, что у меня есть, это указатель char * (назовем его pData
) на начало блока памяти с этими закодированными данными. Каков «лучший» способ использования данных для восстановления wstring («foo»), а также для перемещения указателя на следующий байт после конца закодированных данных?
Я играл с istringstream, чтобы позволить мне использовать префиксный байт, длину строки и разделитель. После этого я могу рассчитать, сколько байтов нужно прочитать, и использовать функцию потока read()
для вставки в wstring с соответствующим изменением размера. Проблема в том, как мне сначала получить эту память в поток istring? I мог бы сначала попытаться создать строку, а затем передать ее в поток istring, например,
std::string s((const char*)pData);
но это не работает, потому что строка усекается в первом нулевом байте. Или я мог бы использовать другой конструктор строки, чтобы явно указать, сколько байтов использовать:
std::string s((const char*)pData, len);
, который работает, но только если я заранее знаю, что такое len
. Это сложно, учитывая, что данные имеют переменную длину.
Это похоже на действительно решаемую проблему. Означает ли мой статус новобранца со строками и потоками, что я упускаю простое решение? Или я лаю не то дерево с помощью всего строкового подхода?