¿Hay alguna forma de convertir char[]
en unsigned char*
?Convertir matriz de caracteres a caracteres sin signo *
char buf[50] = "this is a test";
unsigned char* conbuf = // what should I add here
¿Hay alguna forma de convertir char[]
en unsigned char*
?Convertir matriz de caracteres a caracteres sin signo *
char buf[50] = "this is a test";
unsigned char* conbuf = // what should I add here
Aunque puede no ser técnicamente 100% legal esto funcionará reinterpret_cast<unsigned char*>(buf)
.
La razón de que esto no es 100% técnicamente legal se debe a la sección 5.2.10 expr.reinterpret.cast
bala 7.
Un puntero a un objeto se puede convertir explícitamente a un puntero a un objeto de una diferente tipo. el tipo original produce el valor del puntero original, el resultado de dicha conversión del puntero no está especificado.
Lo que significa que *reinterpret_cast<unsigned char*>(buf) = 'a'
no está especificado, pero *reinterpret_cast<char*>(reinterpret_cast<unsigned char*>(buf)) = 'a'
está bien.
Si recuerdo correctamente el estándar, hay una excepción que dice que es legal usar el puntero a [[un] signed] char para acceder a la memoria de un objeto de cualquier tipo. Creo que hace que el comportamiento de tu código esté bien definido. – HolyBlackCat
@HolyBlackCat No recuerdo ninguna de estas palabras, si pudiera proporcionar una referencia, actualizaré la respuesta. – Motti
Desafortunadamente no puedo encontrar una referencia estándar. Pero encontré algunas afirmaciones en SO que hay una excepción a la regla de aliasing estricta para 'char *' (lo que significa que "es legal usar puntero a [[un] signed) char para acceder a la memoria de un objeto de cualquier tipo "). Vea esto: http://stackoverflow.com/a/99010/2752075 'Puede usar char * para aliasing <...>. Las reglas permiten una excepción para char * (incluyendo char firmado y char sin signo). Siempre se supone que char * aliases otros tipos. Sin embargo, esto no funcionará de la otra manera: no hay suposición de que su estructura alias un búfer de caracteres. – HolyBlackCat