Jochen Arndt
Один CString
представляет собой последовательность TCHAR
персонажи. Один TCHAR
это char
или wchar_t
в зависимости от настройки набора символов проекта (ANSI/многобайтовый или Unicode).
Вы можете привести указатель к данным в поле CString
к BYTE*
:
const BYTE *pByte = reinterpret_cast<const BYTE*>(str.GetString());
Обратите внимание, что я использовал приведение C++ здесь и использую
const
потому что
CString::GetString()
тип возврата-это
LPCTSTR
. Если вам действительно нужен неконстантный указатель (хотите изменить
CString
) вы можете использовать
CString::GetBuffer()
но тогда тебе придется позвонить
CString::ReleaseBuffer()
впоследствии.
Если у вас есть сборка Unicode, количество символов в строке не совпадает с количеством байтов. Вы должны учитывать это при копировании в массив байтов. Тогда также нет необходимости в
BYTE*
указатель:
CByteArray arrByte2;
// The number of bytes in the CString including the terminating NULL bytes
size_t byteSize = (str.GetLength() + 1) * sizeof (TCHAR);
arrByte2.SetSize(byteSize);
// No need to cast here because the memcpy() parameters are of type void*
memcpy(arrByte2.GetData(), str.GetString(), byteSize);
Теперь массив байтов содержит все байты из строки включая завершающие нулевые байты и может быть назначен обратно a
CString
:
CString text(reinterpret_cast<LPCTSTR>(arrByte2.GetData()), arrByte2.GetSize() / sizeof(TCHAR));
Обратите внимание, что количество символов теперь должно быть вычислено путем деления на размер символа. Также не было бы необходимости иметь завершающий нулевой байт в массиве здесь, потому что
CString
конструкторы, принимающие параметр длины, добавят его.