преобразование Cstring в BYTE

Я использую Visual Studio c ++ и хочу преобразовать Cstring в байт. Я написал этот код, но он дал мне ошибку во второй строке, что «данные» не определены.

CString data = _T( "OK");
LPBYTE pByte = new BYTE[data.GetLength() + 1];
memcpy(pByte, (VOID*)LPCTSTR(data), data.GetLength());

Более того, мне нужно преобразовать LPBYTE в const char для функции strcmp. Я написал код, но не могу найти проблему с ним.

const LPBYTE lpBuffer;
LPBYTE lpData = lpBuffer;
CString rcvValue(LPCSTR(lpBuffer));
const CHAR* cstr = (LPCSTR)rcvValue;
if (strcmp (cstr,("ABC")) == 0)
{
////
}

2

Решение

CString тип является шаблоном специализации CStringT, в зависимости от используемого набора символов (CStringA для ANSI, CStringW для Юникода). Хотя вы гарантируете использование соответствующей кодировки при построении из строкового литерала с помощью _T макрос, при копировании контролируемой последовательности в буфер не учитываются требования к разным размерам.

Следующий код исправляет первую часть:

CString data = _T("OK");
size_t size_in_bytes = (data.GetLength() + 1) * sizeof(data::XCHAR);
std::vector<BYTE> buffer(size_in_bytes);
unsigned char const* first = static_cast<unsigned char*>(data.GetString());
unsigned char const* last = first + size_in_bytes;
std::copy(first, last, buffer.begin());

Второй вопрос действительно просит решить решенную проблему. CStringT тип уже обеспечивает CStringT :: Сравнить член, который может быть использован:

const LPBYTE lpBuffer;
CString rcvValue(static_cast<char const*>(lpBuffer));
if (rcvValue.Compare(_T("ABC")) == 0)
{
////
}

Общий совет: всегда предпочитайте использовать бетон CStringT специализация, соответствующая вашей кодировке символов, т.е. CStringA или же CStringW, Код будет намного легче читать и рассуждать, а когда вы столкнетесь с проблемами, с которыми вам нужна помощь, вы можете опубликовать вопрос в Stack Overflow, не объясняя, какие настройки компилятора вы используете.

3

Другие решения

Убедитесь, что вы включили atlstr.h для определения CString, как показано ниже:

#include "stdafx.h"#include <Windows.h>
#include <atlstr.h>

int _tmain(int argc, _TCHAR* argv[])
{
CString data = _T( "OK");
LPBYTE pByte = new BYTE[data.GetLength() + 1];
memcpy(pByte, (VOID*)LPCTSTR(data), data.GetLength());
return 0;
}
1

Я вполне уверен, что Джей прав для вашего первого вопроса. Вы должны включить правильный заголовок.

Что касается вашего второго вопроса, почему вы ожидаете, что этот код будет работать? Давайте посмотрим, что на самом деле делает код, который вы написали.

  1. Создайте указатель на символ (char *) без его инициализации. Это оставляет lpData / lpBuffer, указывающее на случайное место в памяти.
  2. Создайте строку CString и инициализируйте ее этим случайным указателем.
  3. Извлеките буфер из CString и сравните его со строковым литералом.

Учитывая, что CString содержит случайный мусор, что именно вы ожидаете от этого кода? (Кроме ужасного краха? =))

Я также хочу отметить, что вы должны быть более последовательными в своем подходе к строкам. Планируете ли вы поддерживать строки как char, так и wchar_t, как предполагает использование TCHAR в первых разделах? Вы хотите работать со строками в стиле C или использовать такие объекты, как CString? Если вы хотите работать с CString, просто используйте функцию Compare, которую предоставляет CString. Не беспокойтесь о strcmp.

1

Возможно, вы не включили заголовок

    #include <afx.h>

int main()
{
CString data = _T( "OK");
LPBYTE pByte = new BYTE[data.GetLength() + 1];
memcpy(pByte, (VOID*)LPCTSTR(data), data.GetLength());

return 0;
}

Этот код работает нормально.

-1

Вы должны скорее использовать

 CString ss = "123ABC";

BYTE* bp = (BYTE*)ss.GetBuffer(ss.GetLength());

BYTE expected[16] ;

CopyMemory(expected,bp,sizeof(expected));

Просто использование «=» не сработает.

-1
По вопросам рекламы [email protected]