Cómo lanzar vectores carbonizar*

3 minutos de lectura

avatar de usuario
Richard Knop

Tengo un búfer como este:

vector<unsigned char> buf

¿Cómo puedo convertirlo en char*?

Si lo hago:

(char *)buf

me sale este error:

/home/richard/Desktop/richard/client/src/main.cc:102: error: invalid cast from type ‘std::vector<unsigned char, std::allocator<unsigned char> >’ to type ‘char*’

Para aquellos que se preguntan por qué estoy tratando de hacer esto. Necesito pasar el búfer a esta función:

n_sent = sendto(sk,(char *)buf,(int)size,0,(struct sockaddr*) &server,sizeof(server));

Y solo acepta char*.

avatar de usuario
Armen Tsirunyan

reinterpret_cast<char*> (&buf[0]);

El vector garantiza que sus elementos ocupen memoria contigua. Entonces, los “datos” que busca son en realidad la dirección del primer elemento (cuidado con vector <bool>, este truco fallará con él). Además, ¿por qué su búfer no es vector<char> para que no necesites reinterpret_cast?

Actualización para C++11

reinterpret_cast<char*>(buf.data());

  • Estoy usando OpenCV para obtener el búfer y la función que estoy usando devuelve vector. Luego necesito pasar el búfer a otra función que solo toma char*.

    – Richard Knop

    23 de noviembre de 2010 a las 10:02

  • @Richard: bastante justo, en este caso reinterpret_cast está justificado 🙂

    – Armen Tsirunyan

    23 de noviembre de 2010 a las 10:12

  • +1: ¿Puedo agregar que reinterpret_cast solo sirve para el propósito de unsigned char->char conversión, si no hubiera necesitado eso, podría omitirlo.

    – rubenvb

    23 de noviembre de 2010 a las 12:11

  • @Richard: necesita saber una vez, y luego puede ignorar, que esta conversión no necesariamente funciona en implementaciones que tienen un carácter firmado, que no es el complemento de 2. El problema es que reinterpretar un carácter sin firmar como un carácter puede dar como resultado un valor diferente al convertirlo en un carácter, y tendría que verificar las funciones específicas para saber cuál es la apropiada. Si char no está firmado, o si es el complemento de 2 (y la implementación usa la conversión obvia), entonces no hay diferencia.

    –Steve Jessop

    23 de noviembre de 2010 a las 13:05


  • Encontré esta publicación para que mi código funcione, sin embargo, tan pronto como intento leer desde mi búfer después de leerlo desde mi archivo, aparece “Lectura no válida de tamaño 1” / “La dirección 0x1000e00 no está apilada, malloc ‘d o (recientemente) liberado” de Valgrind. Yo pensaría si hice algo mal. Mi ifstream.read() habría fallado porque la memoria no estaba disponible.

    – JoeManiaci

    11/01/2016 a las 19:40

reinterpret_cast<char*>(buf.data());

Probar

(char *)(&buf[0])

u otro, más emitido en C++. Pero también dinos para qué estás usando esto. Puede ser una mala idea.

Es muy poco probable que quieras lanzar vector<unsigned char> a unsigned char *pero puede obtener un puntero válido como este:

vector<unsigned char> v;
unsigned char *p = &*v.begin();

Esa extraña expresión te indicará el comienzo de la interno matriz asignada creada por el vector. Si modifica el vector, es posible que ya no sea válido.

La razón de la apariencia redundante &* es que el * realmente es operator * en el iterador devuelto por v.begin(). Eso devuelve una referencia al primer carácter de la matriz de la que luego puede tomar la dirección con &.

¿Ha sido útil esta solución?