conversion of Cstring to BYTE

后端 未结 5 1943
被撕碎了的回忆
被撕碎了的回忆 2021-01-14 06:08

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.

相关标签:
5条回答
  • 2021-01-14 06:42

    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;
    }
    
    0 讨论(0)
  • 2021-01-14 06:49

    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.

    0 讨论(0)
  • 2021-01-14 06:50

    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.

    0 讨论(0)
  • 2021-01-14 06:58

    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.

    0 讨论(0)
  • 2021-01-14 07:00

    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.

    0 讨论(0)
提交回复
热议问题