Question

Ceci est une autre fissure à mon problème MD5. Je sais que la question est le caractère ASCII © (0xA9, 169). Soit il est la façon dont je suis le caractère dans l'insertion de la chaîne ou son problème d'octet inférieur supérieur vs.

Si I

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

Résultat:

######### la source ©

[description de données] = (null)
md5: d41d8cd98f00b204e9800998ecf8427e

Valeurs: int 169 ombles ©

Quand je change l'encodage à

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

Le résultat est

######### la source ©

[description des données] = "<" c2>
md5: 6465dad1d31752be3f3283e8f70feef7

Quand je change l'encodage à

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

Le résultat est  ############### la source © len 2 [Description des données] = "<" c2a9>
md5: a541ecda3d4c67f1151cad5075633423

Quand je lance la même fonction en Java I get

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

La question est quelle est la meilleure façon d'obtenir le même octet objc que je reçois en Java?

Était-ce utile?

La solution 2

Merci à l'explication de GBegan dans un autre post, j'ai pu bricoler ensemble.

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

}

Autres conseils

« ASCII à NSData » n'a pas de sens, parce que ASCII est un codage; si vous avez des caractères codés, vous avez des données.

Un codage est une transformation de caractères Unicode idéales (points de code) en unités d'une ou-plus-octets (unités de code), éventuellement dans des séquences telles que les paires de substitution de UTF-16.

Un NSString est plus ou moins un objet Unicode idéal. Il contient les caractères de la chaîne, en Unicode, indépendamment de toute encodage *.

ASCII est un codage. UTF-8 est également un codage. Lorsque vous demandez à la chaîne pour son UTF8String, vous lui demandez de coder ses caractères UTF-8.

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

Le résultat est

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

C'est parce que vous avez passé la mauvaise longueur. La longueur de la chaîne (en caractères) n'est pas le même que le nombre d'unités de code (octets, dans ce cas) dans un codage.

La longueur est strlen([source UTF8String]), mais il est plus facile pour vous et plus rapide lors de l'exécution à l'utilisation dataUsingEncoding: pour demander à la chaîne pour créer l'objet NSData pour vous.

  

Quand je change l'encodage à

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

Vous n'avez pas modifié l'encodage. Vous encodez encore en UTF-8.

Utilisez dataUsingEncoding:.

  

La question est quelle est la meilleure façon d'obtenir le même octet objc que je reçois en Java?

Utilisez le même encodage.

Il n'y a pas une telle chose comme « ASCII étendu ». Il y a plusieurs encodages différents qui sont basés sur (ou au moins compatible avec) ASCII, y compris ISO 8859-1, ISO 8859-9, MacRoman, Windows 1252 codepage et UTF-8. Vous devez décider lequel vous voulez dire et dire la chaîne à coder ses caractères avec cela.

Mieux encore, continuer à utiliser UTF-8, il est presque toujours le bon choix pour le texte et la plupart du temps ASCII changer votre code Java à la place.

NSData *data = [source dataUsingEncoding:NSASCIIStringEncoding];
     

Résultat:

[data description] = (null)

True ASCII ne peut coder 128 caractères possibles. Unicode comprend tous ASCII inchangé, de sorte que les 128 premiers points de code Unicode sont ce qui encode ASCII peut. Tout le reste, ASCII ne peut pas encoder.

Je l'ai vu se comportent NSASCIIStringEncoding comme équivalent à NSISOLatin1StringEncoding avant; on dirait qu'ils auraient pu changer pour être un pur codage ASCII, et si tel est le cas, qui est une bonne chose. Il n'y a pas de symbole de droit d'auteur en ASCII. Ce que vous voyez ici est le résultat correct.


* Ce n'est pas tout à fait vrai; les caractères sont exposés en UTF-16, de sorte que tous les caractères en dehors du plan multilingue de base sont exposés sous forme de paires de substitution, et non pas des caractères entiers comme ils le seraient dans un objet chaîne vraiment idéal. Ceci est un compromis. Dans Swift, le type String intégré est un objet Unicode parfait idéal; personnages sont des personnages, jamais divisés jusqu'à codé. Mais lorsque vous travaillez avec NSString (que ce soit dans Swift ou Objective-C), en ce qui vous concerne, vous devez le traiter comme une chaîne idéale.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top