Не удается преобразовать CString в массив БАЙТОВ

StackOverflow https://stackoverflow.com/questions/2460571

  •  20-09-2019
  •  | 
  •  

Вопрос

Мне нужно преобразовать 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() при его инициализации)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top