Pregunta

Esta es otra grieta en mi problema MD5. Sé que el problema está relacionado con el carácter ASCII © (0xa9, 169). O bien es cierto Estoy insertando el carácter en la cadena o es un problema menor byte alto vs.

Si

 NSString *source = [NSString stringWithFormat:@"%c", 0xa9];

    NSData *data = [source dataUsingEncoding:NSASCIIStringEncoding];

    NSLog(@"\n\n ############### source %@ \ndata desc %@", source, [data description]);

CC_MD5([data bytes], [data length], result);

     return [NSString stringWithFormat:
   @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
   result[0], result[1], result[2], result[3], 
   result[4], result[5], result[6], result[7],
   result[8], result[9], result[10], result[11],
   result[12], result[13], result[14], result[15]
   ];

Resultados:

######### © fuente

[descripción de datos] = (null)
md5: d41d8cd98f00b204e9800998ecf8427e

valores: int 169 Char ©

Cuando cambio la codificación a

NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source length]];

El resultado es

######### © fuente

[descripción de datos] = "<" c2>
md5: 6465dad1d31752be3f3283e8f70feef7

Cuando cambio la codificación a

NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];

El resultado es  ############### fuente © len 2 [Descripción de datos] = "<" c2a9>
md5: a541ecda3d4c67f1151cad5075633423

Al ejecutar la misma función en Java I get

">>>>> msg ## \ 251 \ 251
  md5 a252c2c85a9e7756d5ba5da9949d57ed

La pregunta es ¿cuál es la mejor manera de conseguir el mismo byte en ObjC como consiga en Java?

¿Fue útil?

Solución 2

Gracias a la explicación de Gbegan en otro post que era capaz de improvisar juntos.

for(int c = 0; c < [s length]; c++){
    int number = [s characterAtIndex:c];
    unsigned char c[1];
    c[0] = (unsigned char)number;
    NSMutableData *oneByte = [NSMutableData dataWithBytes:&c length:1];

}

Otros consejos

“ASCII a NSData” no tiene sentido, porque ASCII es una codificación; si ha codificado caracteres, entonces usted tiene datos.

Una codificación es una transformación de ideales caracteres Unicode (puntos de código) en unidades de una o-más-byte (unidades de código), posiblemente en secuencias tales como pares suplentes de UTF-16.

Un NSString es más o menos un objeto ideal Unicode. Contiene los caracteres de la cadena, en Unicode, independientemente de cualquier codificación *.

ASCII es una codificación. UTF-8 es también una codificación. Cuando preguntas a la cadena por su UTF8String, que está pidiendo a codificar sus personajes como UTF-8.

NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source length]];
     

El resultado es

 ######### source ©
 [data description] = "<"c2>

Esto se debe a que ha pasado la longitud incorrecta. La longitud de la cadena (en caracteres) no es el mismo que el número de unidades de código (bytes, en este caso) en algunos de codificación.

La longitud correcta es strlen([source UTF8String]), pero es más fácil para usted y más rápido en tiempo de ejecución para el uso dataUsingEncoding: para pedir la cadena para crear el objeto NSData para usted.

  

Cuando cambio la codificación a

NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];

no cambió la codificación. Todavía estás que lo codifica como UTF-8.

Uso dataUsingEncoding:.

  

La pregunta es ¿cuál es la mejor manera de conseguir el mismo byte en ObjC como consiga en Java?

Usar la misma codificación.

No hay tal cosa como “ASCII extendido”. Hay varias codificaciones diferentes que se basan en (o al menos compatible con) ASCII, incluyendo ISO 8859-1, ISO 8859-9, MacRoman, Windows página de códigos 1252, y UTF-8. Es necesario decidir cuál te refieres y decirle a la cadena para codificar sus personajes con eso.

Mejor aún, seguir utilizando UTF-8-casi siempre es la mejor opción para la mayoría-ASCII de texto y cambiar su código Java en su lugar.

NSData *data = [source dataUsingEncoding:NSASCIIStringEncoding];
     

Resultados:

[data description] = (null)

Es cierto ASCII sólo puede codificar 128 caracteres posibles. Unicode incluye todos ASCII sin cambios, por lo que los primeros 128 puntos de código de Unicode son los que codifican ASCII lata. Cualquier otra cosa, ASCII no puede codificar.

he visto comportarse NSASCIIStringEncoding como equivalente a NSISOLatin1StringEncoding antes; suena como que podría haber cambiado a ser una codificación ASCII puro, y si ese es el caso, eso es una cosa buena. No hay ningún símbolo de copyright en ASCII. Lo que se ve aquí es el resultado correcto.


* Esto no es del todo cierto; los personajes se exponen como UTF-16, por lo que cualquier caracteres fuera del plano básico multilingüe se exponen como pares suplentes, no caracteres enteros, ya que sería en un objeto de cadena verdaderamente ideal. Esta es una solución de compromiso. En Swift, la incorporada en el tipo String es un objeto perfecto ideales Unicode; personajes son personajes, no divididas hasta codificada. Sin embargo, cuando se trabaja con NSString (ya sea en Swift o en Objective-C), por lo que usted se refiere, se debe tratar como una cuerda ideal.

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