Estoy usando Visual Studio c++ y desea convertir el objeto Cstring Byte. He escrito este código pero me dio error en la segunda línea de que los «datos» no está definido.

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

Más necesito para convertir LPBYTE a const char para la función strcmp. He escrito el código, pero no puedo encontrar el problema.

const LPBYTE lpBuffer;
LPBYTE lpData = lpBuffer;
CString rcvValue(LPCSTR(lpBuffer));
const CHAR* cstr = (LPCSTR)rcvValue;
if (strcmp (cstr,("ABC")) == 0)
{
    ////
}
  • Que el código es correcto (suponiendo que se cuenta para el final 0 después. Por favor, pegue el verdadero error que estás recibiendo.
  • Este código no es correcto en absoluto. Funciona si el tipo de base para CString es ‘char’, pero si Unicode está habilitado, y la base es de tipo wchar_t este se rompe. GetLength devuelve el número de caracteres (que es el número de caracteres o wchar_t s), no el número de bytes asignados para sujetar la cuerda.
InformationsquelleAutor Nabeel | 2012-09-10

5 Comentarios

  1. 3

    La CString es un tipo de plantilla de especialización de CStringT, según el conjunto de caracteres que utiliza (CStringA para ANSI, CStringW para Unicode). Mientras se asegura de que el uso de una coincidencia de codificación en la construcción de un literal de cadena mediante el uso de la _T macro, no cuenta para los diferentes requisitos de tamaño cuando se copia la secuencia controlada en el búfer.

    Las siguientes correcciones del código de la primera parte:

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

    La segunda pregunta es, realmente, pidiendo a resolver un problema resuelto. El CStringT tipo que ya proporciona un CStringT::Compare miembro, que pueden ser utilizados:

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

    Consejo General: Siempre prefiero usar el hormigón CStringT especialización que coincidan con su codificación de caracteres, es decir, CStringA o CStringW. El código será mucho más fácil de leer y razonar acerca, y cuando te encuentras con problemas necesita ayuda, usted puede publicar una pregunta en el Desbordamiento de la Pila, sin tener que explicar, ¿qué configuración de compilador que está utilizando.

  2. 1

    Asegúrese de incluir atlstr.h para proporcionar la definición de CString, como a continuación:

    #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;
    }
    • yo no downvote tu comentario amigo. pero u votada abajo me – lol
    • no a mí! Creo que alguien más votada abajo de nosotros, al menos temporalmente.
    • Se parece a la pByte BYTE matriz no será lo suficientemente grande como si Unicode está habilitado, ya que cada char en el CString tomará 2 BYTEs pero data.GetLength() devuelve el número de caracteres.
  3. 1

    Estoy bastante seguro de que Jay es la correcta para la primera pregunta. Se debe incluir el derecho de encabezado.

    Para tu segunda pregunta, ¿por qué esperar a que el código de trabajo? Vamos a caminar a través de lo que el código que has escrito realmente.

    1. Crear un puntero char (char *) sin inicializarla. Esto deja lpData/lpBuffer apuntando al azar a una ubicación en la memoria.
    2. Crear un objeto CString y se inicializa con este puntero al azar.
    3. Extraer el tampón de la CString y compararlo con un literal de cadena.

    Teniendo en cuenta que el objeto CString contiene aleatorio de basura, ¿qué es exactamente lo que puede esperar de este código a hacer? (Aparte de accidente horriblemente? =) )

    También quiero señalar que usted necesita para ser más consistente en su enfoque de cadenas. ¿Plan de apoyo a ambos char y wchar_t basado en cadenas como el uso de TCHAR en las primeras secciones sugiere? ¿Quieres trabajar con strings de Estilo C o quieres utilizar objetos como CString? Si quieres trabajar con CString s, sólo tiene que utilizar la función de comparación que CString proporciona. No te molestes con strcmp.

  4. -1

    Probablemente no incluyen el cruicial encabezado

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

    Este código funciona bien.

    • esto arroja AccessViolationException
    • No hay AccessViolationException en C++, y si los hubiera, el código no subirla. Ella aún no cuenta para los requisitos de tamaño del tipo de letra utilizado por CString (podría ser char o wchar_t), pero que hace que la cadena para obtener truncado. El comportamiento es todavía bien definida.
  5. -1

    Que más bien debe usar

     CString ss = "123ABC";
    
     BYTE* bp = (BYTE*)ss.GetBuffer(ss.GetLength());
    
     BYTE expected[16] ; 
    
     CopyMemory(expected,bp,sizeof(expected));

    Sólo el uso de ‘=’ no funciona.

    • No, eso no va a funcionar, por muchas razones. Cuando se llama a GetBuffer(), también es necesario llamar a ReleaseBuffer() (o amigos) para más adelante. Pero usted no necesita una variable puntero de todos modos, por lo que sólo llame GetString(). El código también no tiene en cuenta para la codificación de caracteres Unicode. CString podría almacenar caracteres codificados como UTF-16 (y ese es el valor predeterminado de Visual Studio para muchos años), es decir, 2 bytes por cada unidad de código. El código simplemente trunca tales cadenas.

Dejar respuesta

Please enter your comment!
Please enter your name here