将Cstring转换为BYTE

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将Cstring转换为BYTE相关的知识,希望对你有一定的参考价值。

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

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

我还需要将LPBYTE转换为const char for strcmp函数。我写了代码,但我找不到它的问题。

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

CString类型是CStringT的模板特化,取决于它使用的字符集(ANSI的CStringA,Unicode的CStringW)。虽然在使用_T macro从字符串文字构造时确保使用匹配编码,但在将受控序列复制到缓冲区时,无法考虑不同的大小要求。

以下代码修复了第一部分:

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上发布问题,而无需解释您正在使用的编译器设置。

另一答案

确保包含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;
}
另一答案

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

对于您的第二个问题,为什么您希望该代码有效?让我们来看看你写的代码实际上是做什么的。

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

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

我还想指出,你需要在你的字符串方法中更加一致。您是否计划支持基于char和wchar_t的字符串,因为您在第一部分中建议使用TCHAR?你想使用C-Style字符串还是想使用像CString这样的对象?如果你想使用CString,只需使用CString提供的Compare函数。不要打扰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));

只使用'='将无效。

以上是关于将Cstring转换为BYTE的主要内容,如果未能解决你的问题,请参考以下文章

如何将 CString 转换为字节

CString到字节和字节到CByteArray转换-MFC

java怎么将string转换成byte数组

mfc中,如何将CString 转换成 string

c# byte数组转string

MFC中char*,string和CString之间的转换(待补充)