2010-03-17 3 views
2

Мне нужно преобразовать CString в массив BYTE. Я не знаю почему, но все, что я нашел в Интернете не работает :( К примеру, у меня естьНевозможно преобразовать 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 содержит только первую букву ул

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

является 2

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

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

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

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

ответ

2

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

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

1

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

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

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

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

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

Смежные вопросы