Невозможно преобразовать CString в массив BYTE - PullRequest
2 голосов
/ 17 марта 2010

Мне нужно конвертировать CString в массив BYTE. Не знаю почему, но все, что я нашел в интернете, не работает :( Например, у меня есть

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();

И всегда pbBuffer содержит только первую букву str

DWORD dwBufferLen = strlen((char *)pbBuffer)+1;

составляет 2

Но если я использую константную строку:

BYTE *pbBuffer = (BYTE*)"string";

pbBuffer содержит целую строку

Где моя ошибка?

Ответы [ 2 ]

2 голосов
/ 17 марта 2010

Ваш CString - Unicode (два байта на символ), и вы пытаетесь интерпретировать его как ANSI (один байт на символ). Это приводит к результатам, которых вы не ожидаете.

Вместо преобразования базового буфера в char* вам необходимо преобразовать данные. Для этого используйте WideCharToMultiByte () .

1 голос
/ 17 марта 2010

Вы, вероятно, компилируете с юникодом.Это означает, что ваша CString содержит wchar_t вместо char.Преобразование указателя wchar_t в указатель на символ приводит к тому, что второй байт первого wchar_t интерпретируется как терминатор строки (поскольку для наиболее распространенных символов это значение равно 0)

При использовании Visual Studio всегда следует использовать _T() для объявления строковых литералов и TCHAR в качестве типа вашего символа.В вашем случае:

BYTE* pBuffer = (BYTE*)(LPCTSTR)str;

Вы получаете буфер, но каждый второй байт, скорее всего, равен нулю.

Используйте CStringA, если вам нужна строка ANSI.(Но затем пропустите _T () при инициализации)

...