3

我正在使用 Visual Studio c++ 并希望将 Cstring 转换为字节。我已经编写了这段代码,但它在第二行给了我“数据”未定义的错误。

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

此外,我需要将 LPBYTE 转换为 strcmp 函数的 const char。我已经编写了代码,但我找不到它的问题。

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

5 回答 5

4

CString类型是CStringT的模板特化,具体取决于它使用的字符集(CStringA对于 ANSI,CStringW对于 Unicode)。虽然您确保在使用_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::Compare成员,可以使用:

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

一般建议:始终更喜欢使用CStringT与您的字符编码匹配的具体专业化,即CStringACStringW. 代码将更容易阅读和推理,当您遇到需要帮助的问题时,您可以在 Stack Overflow 上发布问题,而无需解释您使用的编译器设置。

于 2018-09-04T08:25:46.417 回答
1

我相当肯定杰伊对你的第一个问题是正确的。您需要包含正确的标题。

对于您的第二个问题,您为什么希望该代码能够工作?让我们来看看您编写的代码实际上做了什么。

  1. 创建一个 char 指针 (char *) 而不对其进行初始化。这使得 lpData/lpBuffer 指向内存中的一个随机位置。
  2. 创建一个 CString 并使用此随机指针对其进行初始化。
  3. 从 CString 中提取缓冲区并将其与字符串文字进行比较。

请记住,CString 包含随机垃圾,您希望这段代码能做什么?(除了可怕的崩溃?=)

我还想指出,您需要在处理字符串的方法上更加一致。您是否计划同时支持基于 char 和 wchar_t 的字符串,正如您在第一部分中使用 TCHAR 所暗示的那样?你想使用 C 风格的字符串还是想使用像 CString 这样的对象?如果您想使用 CString,只需使用 CString 提供的比较函数。不要打扰strcmp。

于 2012-09-10T18:22:34.117 回答
1

确保包含 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;
}
于 2012-09-10T17:44:27.933 回答
-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;
    }

这段代码工作正常。

于 2012-09-10T17:51:39.540 回答
-1

你应该使用

 CString ss = "123ABC";

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

 BYTE expected[16] ; 

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

仅使用 '=' 是行不通的。

于 2017-03-27T16:06:54.547 回答