Не удается преобразовать CString в массив БАЙТОВ
Вопрос
Мне нужно преобразовать CString в массив байтов.Я не знаю почему, но все, что я нашел в интернете, не работает:( Например, у меня есть
CString str = _T("string");
Я так старался 1)
BYTE *pbBuffer = (BYTE*)(LPCTSTR)str;
2)
BYTE *pbBuffer = new BYTE[str.GetLength()+1];
memcpy(pbBuffer, (VOID*)(LPCTSTR)StrRegID, str.GetLength());
3)
BYTE *pbBuffer = (BYTE*)str.GetString();
И всегда Буфер PBB содержит только первую букву str
DWORD dwBufferLen = strlen((char *)pbBuffer)+1;
равно 2
Но если я использую const строку:
BYTE *pbBuffer = (BYTE*)"string";
Буфер PBB содержит целую строку
В чем моя ошибка?
Решение
Ваша CString - это Unicode (два байта на символ), и вы пытаетесь интерпретировать ее как ANSI (один байт на символ).Это приводит к результатам, которых вы не ожидаете.
Вместо приведения базового буфера в char*
вам нужно преобразовать полученные данные.Использование WideCharToMultiByte() за это.
Другие советы
Вероятно, вы компилируете с помощью unicode.Это означает, что ваша CString содержит wchar_t вместо char .Преобразование указателя wchar_t в указатель char приводит к интерпретации второго байта первого wchar_t как завершителя строки (поскольку для наиболее распространенных символов это значение равно 0)
При использовании Visual Studio вы всегда должны использовать _T() для объявления строковых литералов и TCHAR в качестве вашего символьного типа.В вашем случае:
BYTE* pBuffer = (BYTE*)(LPCTSTR)str;
Вы получаете буфер, но каждый второй байт, скорее всего, равен нулю.
Используйте CStringA, если вам нужна строка ANSI.(Но затем пропустите _T() при его инициализации)