CSTRING转化为BYTE(conversion of Cstring to BYTE)

2019-06-28 03:16发布

我使用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)
{
    ////
}

Answer 1:

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 ::比较成员,可以使用:

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

一般的建议:总是喜欢用混凝土CStringT专业化匹配字符编码,即CStringACStringW 。 该代码会更容易阅读和推理,当你遇到你需要帮助,您可以张贴在堆栈溢出的问题,而无需解释的问题,你所使用的编译器设置。



Answer 2:

请确保您有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;
}


Answer 3:

我相当肯定周杰伦是你的第一个问题是正确的。 您需要包括正确的头。

关于第二个问题,你为什么会想到的是代码的工作? 让我们通过你所编写的代码实际上做。

  1. 没有初始化它创建一个字符指针(字符*)。 这留下的lpData / lpBuffer指向内存中的一个随机位置。
  2. 创建一个CString以及与此随机指针初始化。
  3. 摘自CString的缓冲区,并把它比作一个字符串。

请记住,CString对象包含随机的垃圾,你到底希望这个代码呢? (除了崩溃可怕?=))

我也想指出的是,你需要在你的方法为字符串更加一致。 你打算支持char和wchar_t的基于字符串作为你的第一部分建议使用TCHAR的? 你想与C风格的字符串工作或你想使用像CString的对象呢? 如果你想用的CString的工作,只需要使用比较功能的CString提供。 不要使用strcmp打扰。



Answer 4:

也许你不包括cruicial头

    #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;
    }

此代码工作正常。



Answer 5:

你还是使用

 CString ss = "123ABC";

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

 BYTE expected[16] ; 

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

只是用“=”将无法正常工作。



文章来源: conversion of Cstring to BYTE