srinivasankrishnaa Ответов: 2

Преобразование Cstring в байт и byte в cbytearray-MFC


Я попытался преобразовать CString в BYTE* и "BYTE* в CByteArray" в MFC,CString был преобразован в BYTE*. Но я не могу преобразовать весь байт целиком* В CByteArray Он Возвращает Частичные Данные С Некоторыми Мусорными Значениями. Я Описал Здесь Свою Реальную Проблему...

Что я уже пробовал:

CString csData =_T("someData");

BYTE *pByteArray = (PBYTE)(LPCTSTR)csData.GetBuffer();

CString str;
str=LPTSTR(pByteArray);
AfxMessageBox(str); //returns "someData" 

CByteArray arrByte2;

arrByte2.SetSize(csData.GetLength()+1);

memcpy(arrByte2.GetData(), pByteArray, csData.GetLength()+1);

CString text((LPTSTR)arrByte2.GetData(),arrByte2.GetSize());
CStringA result(text);
AfxMessageBox(text);//returns "some﵄﷽꯽ꮫꮫ"

2 Ответов

Рейтинг:
17

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 конструкторы, принимающие параметр длины, добавят его.


Рейтинг:
1

KarstenK

Поскольку вы используете Юникод, строка имеет размер 2 байта, и поэтому ваш буфер слишком мал. Таким образом, Вы удваиваете размер буфера CByteArray.

arrByte2.SetSize(2*(csData.GetLength()+1));

Кстати: вы смотрели его правильно, но не поняли его как намек на ошибку ;-)