Domanda

Questa è un'altra crepa al mio problema MD5. So che il problema è con il carattere ASCII © (0xa9, 169). O è il modo in cui sto inserendo il carattere nella stringa o la sua una più alta vs bassa problema di byte.

Se io

 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]
   ];

Risultato:

######### fonte ©

[descrizione dei dati] = (null)
md5: d41d8cd98f00b204e9800998ecf8427e

Valori: int 169 char ©

Quando cambio la codifica da

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

Il risultato è

######### fonte ©

[descrizione dei dati] = "<" c2>
md5: 6465dad1d31752be3f3283e8f70feef7

Quando cambio la codifica da

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

Il risultato è  ############### fonte © len 2 [Descrizione dei dati] = "<" c2a9>
md5: a541ecda3d4c67f1151cad5075633423

Quando eseguo la stessa funzione in Java I get

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

La domanda è: qual è il modo migliore per ottenere lo stesso byte in objc mentre ottengo in Java?

È stato utile?

Soluzione 2

Grazie alla spiegazione di GBegan in un altro post ho potuto a mettere insieme.

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];

}

Altri suggerimenti

“ASCII per NSData” non ha senso, perché ASCII è una codifica; se avete codificato caratteri, quindi si dispone di dati.

Una codifica è una trasformazione di caratteri Unicode ideali (punti codice) in unità di una o più-byte (unità di codice), eventualmente in sequenze come coppie di surrogati UTF-16 di.

Un NSString è più o meno un oggetto Unicode ideale. Esso contiene le caratteri della stringa, in Unicode, indipendentemente da qualsiasi codifica *.

ASCII è una codifica. UTF-8 è una codifica. Quando si chiede la stringa per la sua UTF8String, si sta chiedendo che per codificare i suoi personaggi come UTF-8.

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

Il risultato è

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

Questo perché hai superato la lunghezza sbagliata. la lunghezza della corda (in caratteri) non è uguale al numero di unità di codice (byte, in questo caso) in qualche codifica.

La lunghezza corretta è strlen([source UTF8String]), ma è più facile per voi e più veloce in fase di esecuzione per l'uso dataUsingEncoding: a chiedere la stringa per creare l'oggetto NSData per voi.

  

Quando cambio la codifica da

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

Non hai cambia la codifica. Sei ancora la codifica UTF-8.

Usa dataUsingEncoding:.

  

La domanda è: qual è il modo migliore per ottenere lo stesso byte in objc mentre ottengo in Java?

Usa la stessa codifica.

Non esiste una cosa come “ASCII esteso”. Ci sono diverse codifiche differenti che si basano su (o almeno compatibile con) ASCII, tra cui ISO 8859-1, ISO 8859-9, MacRoman, Windows codepage 1252 e UTF-8. È necessario decidere quale vuoi dire e dire la stringa di codificare i suoi personaggi con quello.

Meglio ancora, continuare a utilizzare UTF-8-è quasi sempre la scelta giusta per la maggior parte-ASCII testo e modificare il codice Java, invece.

NSData *data = [source dataUsingEncoding:NSASCIIStringEncoding];
     

Risultato:

[data description] = (null)

La vera ASCII può codificare solo 128 caratteri possibili. Unicode include tutti ASCII invariata, per cui i primi 128 punti codice di Unicode sono ciò ASCII possibile codificare. Tutto il resto, ASCII non può codificare.

Ho visto NSASCIIStringEncoding si comportano come equivalente a NSISOLatin1StringEncoding prima; suona come avrebbero potuto cambiato per essere una codifica ASCII puro, e se questo è il caso, che è una buona cosa. Non v'è alcun simbolo di copyright in ASCII. Quello che vedete qui è il risultato corretto.


* Questo non è del tutto vero; i personaggi sono esposti come UTF-16, quindi i caratteri al di fuori del Basic Multilingual Plane sono esposti come coppie di surrogati, caratteri non interi come sarebbero in un oggetto stringa veramente ideale. Si tratta di un trade-off. Swift, il tipo predefinito stringa è un oggetto perfetto Unicode ideale; personaggi sono personaggi, mai divisi fino codificato. Ma quando si lavora con NSString (sia a Swift o in Objective-C), per quanto vi riguarda, si dovrebbe trattare come una stringa ideale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top