Nabeel
Nabeel

Reputation: 123

conversion of Cstring to BYTE

I am using Visual Studio c++ and want to convert the Cstring to Byte. I have written this code but it gave me error in the second line that "data" is undefined.

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

Further more I need to convert LPBYTE to const char for strcmp function. I have written the code but I can't find the issue with it.

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

Upvotes: 3

Views: 16059

Answers (5)

IInspectable
IInspectable

Reputation: 51414

The CString type is a template specialization of CStringT, depending on the character set it uses (CStringA for ANSI, CStringW for Unicode). While you ensure to use a matching encoding when constructing from a string literal by using the _T macro, you fail to account for the different size requirements when copying the controlled sequence to the buffer.

The following code fixes the first part:

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());

The second question is really asking to solve a solved problem. The CStringT type already provides a CStringT::Compare member, that can be used:

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

General advice: Always prefer using the concrete CStringT specialization matching your character encoding, i.e. CStringA or CStringW. The code will be much easier to read and reason about, and when you run into problems you need help with, you can post a question at Stack Overflow, without having to explain, what compiler settings you are using.

Upvotes: 4

Mostafa Hashemi
Mostafa Hashemi

Reputation: 1

You should rather use

 CString ss = "123ABC";

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

 BYTE expected[16] ; 

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

Just using '=' won't work.

Upvotes: -1

0x6B6F77616C74
0x6B6F77616C74

Reputation: 2629

Probably you didn't include the cruicial header

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

This code works fine.

Upvotes: -1

Nathanael
Nathanael

Reputation: 1772

I'm fairly certain Jay is correct for your first question. You need to include the right header.

For your second question, why would you expect that code to work? Let's walk through what the code you've written actually does.

  1. Create a char pointer (char *) without initializing it. This leaves lpData/lpBuffer pointing to a random location in memory.
  2. Create a CString and initialize it with this random pointer.
  3. Extract the buffer from the CString and compare it to a string literal.

Keeping in mind that the CString contains random garbage, what exactly do you expect this code to do? (Other than crash horribly? =) )

I also want to point out that you need to be more consistent in your approach to strings. Do you plan to support both char and wchar_t based strings as your use of TCHAR in the first sections suggests? Do you want to work with C-Style strings or do you want to use objects like CString? If you want to work with CString's, just use the Compare function that CString provides. Don't bother with strcmp.

Upvotes: 1

Jay
Jay

Reputation: 10460

Make sure you include atlstr.h to provide the definition of CString, as below:

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

Upvotes: 1

Related Questions