Conversión de estilo C ++ de unsigned char * a const char *

80

Yo tengo:

unsigned char *foo();
std::string str;
str.append(static_cast<const char*>(foo()));

El error: invalid static_cast from type ‘unsigned char*’ to type ‘const char*’

¿Cuál es la forma correcta de emitir aquí en estilo C ++?

Jackhab
fuente
3
El carácter sin firmar se ha utilizado normalmente para contener cadenas de estilo Unicode, ¿está seguro de que desea convertirlo directamente en lugar de convertir el contenido?
Greg Domjan

Respuestas:

48

reinterpret_cast

Ruben Bartelink
fuente
6
@ jesses.co.tt Gracias por el voto negativo. La característica clave de esta publicación que hace que sea votada a favor es su puntualidad. Las otras respuestas brindan varios detalles y es mejor leerlas y votarlas por separado. Si la respuesta de @JaredPars cubre lo que está buscando, lo usaría y / o lo votaría. Notarás que también he invertido tiempo en mejorar el formato de esos. Realmente no veo el sentido de expandir esta respuesta para abarcar el contenido de las demás.
Ruben Bartelink
3
ok, entiendo que su razón de ser aquí, y tomado como una página completa, estoy de acuerdo en que no hubo necesidad de volver a articular ... Supongo que es difícil tomarse el tiempo y mirar la página completa y las marcas de tiempo en lugar de juzgando cada respuesta por sus propios méritos ... pero se toma el punto (¡especialmente de alguien que tiene
55 veces
1
@ jesses.co.tt No se preocupe, entiendo su perspectiva y no está muy equivocado. Para ser honesto, ha pasado mucho tiempo desde que "compití" en etiquetas de alto tráfico con respuestas más rápidas como esta. Pero no obtienes este nivel de reputación eliminando tu respuesta, incluso si eso es lo correcto (¡que otro día estaría discutiendo con la misma alegría!). Bien, tenemos una pared de texto abarrotando el lugar, por lo que su misión está cumplida: P
Ruben Bartelink
23
Me gustó especialmente cómo te preocupaba tanto gritar "¡PRIMERO!" que ni siquiera te molestaste basic formatting.
OJFord
8
Esta es una "respuesta" verdaderamente inútil. Simplemente no proporciona información.
OYRM
60

char *y const unsigned char *se consideran tipos no relacionados. Entonces quieres usar reinterpret_cast.

Pero si va a pasar de const unsigned char*un consttipo que no es, debe usar const_castprimero. reinterpret_castno puede desechar una calificación consto volatile.

Brian R. Bondy
fuente
3
"No relacionado" es engañoso aquí: da una impresión que no se puede transmitir de uno a otro. Estoy leyendo un borrador de 2014, "3.9.1 Tipos fundamentales", y dice: "A char, a signed chary an unsigned charocupan la misma cantidad de almacenamiento y tienen el mismo requisito de alineación". Esta ES una relación. O aquí hay un enlace más legible: en.cppreference.com/w/cpp/language/types#Character_types
Victor Sergienko
52

Tratar reinterpret_cast

unsigned char *foo();
std::string str;
str.append(reinterpret_cast<const char*>(foo()));
JaredPar
fuente
18

unsigned char * es básicamente una matriz de bytes y debe usarse para representar datos brutos en lugar de una cadena en general. Una cadena Unicode se representaría como wchar_t *

De acuerdo con el estándar C ++, un reinterpret_cast entre unsigned char * y char * es seguro ya que son del mismo tamaño y tienen la misma construcción y restricciones. Intento evitar reintrepret_cast incluso más que const_cast en general.

Si la transmisión estática falla con lo que está haciendo, es posible que desee reconsiderar su diseño porque, francamente, si está usando C ++, es posible que desee aprovechar lo que ofrece la parte "plus plus" y usar clases de cadena y STL (también conocido como std :: basic_string podría funcionar mejor para ti)

AJG
fuente
6

Debería usar un reinterpret_cast<>ya que los dos tipos entre los que está lanzando no están relacionados entre sí.

Timo Geusch
fuente
6

Demasiados comentarios para hacer a diferentes respuestas, así que dejaré otra respuesta aquí.

Puedes y debes usar reinterpret_cast<>, en tu caso

str.append(reinterpret_cast<const char*>(foo()));

porque, si bien estos dos son tipos diferentes, el capítulo de la norma de 2014 3.9.1 Fundamental types [basic.fundamental]dice que existe una relación entre ellos:

Llano char, signed chary unsigned chartres tipos distintos, denominados colectivamente tipos de caracteres estrechos. A char, signed charay a unsigned charocupan la misma cantidad de almacenamiento y tienen los mismos requisitos de alineación (3.11); es decir, tienen la misma representación de objeto.

(la selección es mía)

Aquí hay un enlace disponible: https://en.cppreference.com/w/cpp/language/types#Character_types

El uso wchar_tde cadenas Unicode / multibyte está desactualizado: ¿Debería usar wchar_t cuando uso UTF-8?

Victor Sergienko
fuente
-4

Espero que te ayude. :)

const unsigned attribName = getname();
const unsigned attribVal = getvalue();
const char *attrName=NULL, *attrVal=NULL;
attrName = (const char*) attribName;
attrVal = (const char*) attribVal;
joi
fuente