Я использую 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)
{
////
}
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, не объясняя, какие настройки компилятора вы используете.
Убедитесь, что вы включили 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;
}
Я вполне уверен, что Джей прав для вашего первого вопроса. Вы должны включить правильный заголовок.
Что касается вашего второго вопроса, почему вы ожидаете, что этот код будет работать? Давайте посмотрим, что на самом деле делает код, который вы написали.
Учитывая, что CString содержит случайный мусор, что именно вы ожидаете от этого кода? (Кроме ужасного краха? =))
Я также хочу отметить, что вы должны быть более последовательными в своем подходе к строкам. Планируете ли вы поддерживать строки как char, так и wchar_t, как предполагает использование TCHAR в первых разделах? Вы хотите работать со строками в стиле C или использовать такие объекты, как CString? Если вы хотите работать с CString, просто используйте функцию Compare, которую предоставляет CString. Не беспокойтесь о strcmp.
Возможно, вы не включили заголовок
#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;
}
Этот код работает нормально.
Вы должны скорее использовать
CString ss = "123ABC";
BYTE* bp = (BYTE*)ss.GetBuffer(ss.GetLength());
BYTE expected[16] ;
CopyMemory(expected,bp,sizeof(expected));
Просто использование «=» не сработает.