2010-11-20 39 views
0

je code Java qui prépare un message pour un munge MD5NSMutableString stringWithFormat

private static char[] jimsCopyRight = { 

'C', 'o', 'p', 'y', 'r', 'i', « g ',' h ', ' t ',': ',' ', 0xa9,' '};

qui est utilisé dans

StringBuffer message = new StringBuffer(); 

message.append (name.toLowerCase()); message.append (new String (jimsCopyRight));

Lorsque j'imprimer le message en utilisant

for(int i = 0; i < message.length(); i++){ 

System.out.println ("i = "+ i +" char "+ message.substring (i, i + 1) +" charAt" + message.charAt (i)); }

je reçois i = 14 ombles \ 251 charAt \ 251 et le message.toString est jimCopyright: \ 251

Je dois construire un NSMutableString avec les mêmes caractères.

Parmi les choses que j'ai essayé

wDevCopyright = [NSString stringWithFormat:@"jimCopyright: %c ", 0xa9]; 
for(int i = 0; i < [message length]; i++){ 
    NSLog(@"i = %d char %c %d", i, [message characterAtIndex:i], [message characterAtIndex:i]); 
} 

Ce qui me donne i = 14 ombles © 169

Toute aide à obtenir le NSMutableString être le même que le StringBuffer sera apprécié. Le problème est que lorsque je munis les deux chaînes dans MD5, j'obtiens des résultats différents lorsque j'ajoute 0xa9. Les impressions sont juste pour jeter un oeil sur les cordes.

Je pense qu'il a quelque chose à voir avec le char [] dans Java et la construction du NSMutableString. Je ne crois pas qu'ils sont les mêmes valeurs.

J'ai un code C et il déclare le droit d'auteur comme

#define jimsCopyRight "Copyright: � " 

Le MD5 MD5 Java et C du droit d'auteur sont les mêmes.

+0

0xa9 est 169, et le caractère 169 est le symbole (c), donc la question est vraiment, pourquoi le cas java pense-t-il son caractère 251? – superfell

+0

Il semblerait que dans votre cas java, votre flux de sortie n'est pas unicode, et vous regardez le flux de sortie lui-même, et vous voyez un résultat d'encodage différent, si vous changez de boucle à – superfell

+0

ystem.out.println ("i =" + i + "char" + message.substring (i, i + 1) + "charAT" + Integer.valueOf (message.charAt (i))); vous verrez que le char est toujours le codepoint 169 (i = 11 char © charAT 169) – superfell

Répondre

2

Le symbole de copyright est ce que vous vouliez, non? D'après votre question, c'est ce que vous avez. Donc quel est le problème?

(Ceci est la raison pour laquelle les nombres magiques sont mauvais. Je ne peux pas dire de votre code seul ce que le codage de 0xa9 que vous vouliez.)

Si vous vous demandez pourquoi il est dit 169 au lieu de 251, c'est parce que imprime Java sur la séquence d'échappement de caractères octal (base-8), tandis que %d dans la bibliothèque standard C, Core Foundation et Foundation imprime la valeur décimal (base-10). \251 n'est pas le deux cent cinquante et unième personnage. Utilisez %o pour imprimer la valeur en octal ou% x pour l'imprimer en hexadécimal (base 16). Ou, utilisez le mode de programmation de Calculator.app pour convertir 251 d'octal en nombre décimal.

BTW, vous pouvez utiliser la séquence de format %@ et la fonction NSUserName pour insérer votre nom d'utilisateur dans la chaîne, tout comme vous l'avez fait dans le code Java. Pas besoin de le coder en dur.

+0

Merci pour la réponse, mais je débogue un problème de hachage MD5 et je pensais que c'était les cordes, mais c'est en fait un problème CC_MD5 UTF8String. –

0

Il vous manque un "s" dans "jim [s] Copyright" dans la version Objective-C.