В C ++, как я могу использовать wstringstream для объединения / concat wstring + NULL + DWORD - PullRequest
0 голосов
/ 08 ноября 2018

Я хочу создать строку wstring + NULL + DWORD например L "Текст" + NULL + 0x001A. Могу ли я использовать wstringstream для создания такой строки, в которой строка заканчивается символом "\ 0" между ними?

hex:54,00,65,00,78,00,74,00,00,00,00,00,1a,00
     T     e     x     t    \0    00    1A

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Если ваш вопрос продолжается, это тема , это копирование-вставка частей из моего кода (с удалением комментариев и окружения):

DWORD dwReaderState, dwSessionID;
CStringW wszReaderName;
CString strTemp;
BYTE pReaderBuff[64];
DWORD cbReaderBuff;
CRegKey regKey;
// ... Data Parsing and values joining...
cbReaderBuff = (wszReaderName.GetLength() + 1) * sizeof(WCHAR);
memcpy(pReaderBuff, wszReaderName.GetBuffer(0), cbReaderBuff);
memcpy(pReaderBuff + cbReaderBuff, &dwReaderState, sizeof(DWORD));
cbReaderBuff += sizeof(DWORD);
// Session ID
ProcessIdToSessionId(GetCurrentProcessId(), &dwSessionID);
strTemp.Format(TEXT("%d"), dwSessionID);
// Writing to the registry
regKey.Create(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), NULL, 0, KEY_READ | KEY_WRITE | KEY_WOW64_64KEY);
regKey.SetBinaryValue(strTemp, pReaderBuff, cbReaderBuff);
0 голосов
/ 09 ноября 2018

Вы можете добавить нулевой символ, используя метод потока put():

my_wstringstream.put(0);

Добавить DWORD (то, что вы показали на самом деле WORD) сложнее. Вы не можете использовать оператор <<, который отформатирует числовое значение в текстовое представление, а это не то, что вы просите. Вместо этого вам придется разбить значение на отдельные байты, а затем put() каждый байт, как если бы это был символ:

my_wstringstream.put(0).put(0x00).put(0x1A);

Однако обратите внимание, что wchar_t - это , а не 2 байта на каждой платформе, вместо этого может быть 4 байта. Таким образом, используя std::wstringstream и std::wstring, вы не гарантируете , чтобы получить точный вывод, который вы ищете на всех платформах. вместо этого вы можете получить следующее:

hex:54,00,00,00,65,00,00,00,78,00,00,00,74,00,00,00,00,00,00,00,00,00,00,00,1a,00,00,00
     T           e           x           t          \0          00          1A

Если вам нужна согласованность на нескольких платформах, вы можете использовать std::basic_stringstream<char16_t> и std::u16string. Или используйте std::stringstream и std::string (которые основаны на 1-байте char) и просто запишите все отдельные байты вручную.

...