Pregunta

Estoy llegando a Objective-C de C# sin conocimientos intermedios de C.(Sí, sí, voy a necesitar para aprender C en algún momento y tengo la intención de.) En Apple Certificado de Clave, y los Servicios de Confianza Guía de Programación, hay el siguiente código:

static const UInt8 publicKeyIdentifier[] = "com.apple.sample.publickey\0";
static const UInt8 privateKeyIdentifier[] = "com.apple.sample.privatekey\0";

Tengo una NSString que me gustaría usar como identificador aquí y para la vida de mí no puedo entender cómo conseguir que en esta estructura de datos.La búsqueda a través de Google ha sido infructuosa también.Me miré en el Referencia De La Clase NSString y miró a la UTF8String y getCharacters los métodos, pero no pude conseguir el producto dentro de la estructura.

¿Cuál es la simple, fácil truco que me falta?

¿Fue útil?

Solución

Creo que algunas personas no viene al caso aquí. Todo el mundo ha explicado las dos matrices constantes que se están creando para las etiquetas, pero si usted desea utilizar una NSString, sólo tiene que añadir al diccionario de atributos como está. Usted no tiene que convertirlo a cualquier cosa. Por ejemplo:

NSString *publicTag = @"com.apple.sample.publickey";
NSString *privateTag = @"com.apple.sample.privatekey";

El resto del ejemplo se mantiene exactamente la misma. En este caso, no hay necesidad de que los literales de cadena C en absoluto.

Otros consejos

Estas son cadenas de C: Arrays (no NSArrays, pero las matrices C) de caracteres. El último carácter es un NUL, con el valor numérico 0.

“uint8” es el nombre CoreServices de un octeto sin signo, que (en Mac OS X) es lo mismo que un unsigned char.

static significa que la matriz es específica para este archivo (si está en el ámbito de archivo) o persiste a través de llamadas de función (si está dentro de un cuerpo de método o función).

const significa justo lo que se adivina:. No se puede cambiar a los personajes de estas matrices

\0 es un NUL, pero incluyendo explícitamente en un "" literal como se muestra en estos ejemplos es redundante. A @ literal (sin el UTF8String) es NUL terminados todos modos.

C no especifica una codificación. En Mac OS X, por lo general es algo ASCII-compatibles, por lo general UTF-8.

Para convertir un NSString a un C-cadena, utilice cStringUsingEncoding: o getCString:maxLength:encoding:. Para tener la NSString extracto de la cadena de C en un tampón, utilizar <=>.

La obtención de un char* (cadena C) de un NSString no es la parte difícil. (Por cierto, también me gustaría sugerir UTF8String, es mucho más simple.) El código suministrado por Apple funciona porque es asignar un C literal de cadena a los static const variables de matriz. Asignar el resultado de una llamada a una función o método a un const probablemente no va a funcionar.

Recientemente respondí a un SO pregunta sobre definir una constante en Objective-C , que debe ayudar a su situación. Puede que tenga que comprometer al deshacerse del modificador static. Si es declarado <=>, por lo menos saber que nadie fuera de la unidad de compilación donde se declaró puede hacer referencia a ella, así que asegúrese de no dejar que una referencia a él "escapar" de tal manera que otro código podría modificarlo a través de un puntero , etc.

Sin embargo, como @ Jason señala, es posible que ni siquiera necesidad de convertirlo a un char * en absoluto. El código de ejemplo crea un objeto NSData para cada una de estas cadenas. Se podía hacer algo como esto en el código (en sustitución de los pasos 1 y 3):

NSData* publicTag  = [@"com.apple.sample.publickey"  dataUsingEncoding:NSUnicodeStringEncoding];
NSData* privateTag = [@"com.apple.sample.privatekey" dataUsingEncoding:NSUnicodeStringEncoding];

Eso sí que parece más fácil para mí que hacer frente a las matrices C si ya tiene una NSString.

Probar

NSString * newString = @ "Esta es una cadena de prueba.";
char * elString;

elString = [newString cStringWithEncoding: [NSString defaultCStringEncoding]];

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top