NSMutableString stringWithFormat

У меня есть код Java, который готовит сообщение для MD5 munge

private static char[] jimsCopyRight = {

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

который используется в

StringBuffer message = new StringBuffer();

message.append(name.toLowerCase()); message.append (новая строка (jimsCopyRight));

Когда я распечатываю сообщение, используя

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

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

Я получаю i = 14 char\251 charAT\251, а message.toString - это jimCopyright:\251

Мне нужно построить NSMutableString с теми же символами.

Среди вещей, которые я пробовал

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

Что дает мне i = 14 символов © 169

Любая помощь в том, чтобы NSMutableString была такой же, как StringBuffer, будет оценена по достоинству.


Проблема в том, что когда я смешиваю две строки в MD5, я получаю разные результаты, когда добавляю 0xa9. Отпечатки нужны только для того, чтобы посмотреть на струны.

Я думаю, что это как-то связано с char[] в Java и конструкцией NSMutableString. Я не верю, что это одни и те же ценности.

У меня есть код C, и он объявляет авторские права как

#define jimsCopyRight  "Copyright: � "

Java MD5 и C MD5 авторского права одинаковы.


person Jim Geldermann    schedule 20.11.2010    source источник
comment
0xa9 - это 169, а юникодный символ 169 - это символ (c), поэтому на самом деле возникает вопрос, почему случай Java считает, что это char 251?   -  person superfell    schedule 21.11.2010
comment
Может показаться, что в вашем случае java ваш выходной поток не является юникодом, и вы смотрите на сам выходной поток, и вы видите какой-то другой результат кодирования, если вы измените свой цикл на   -  person superfell    schedule 21.11.2010
comment
ystem.out.println( i = + i + char + message.substring(i, i + 1) + charAT + Integer.valueOf(message.charAt(i))); вы увидите, что char по-прежнему имеет кодовую точку 169 ( i = 11 char © charAT 169)   -  person superfell    schedule 21.11.2010
comment
@superfell: \251 - это восьмеричная управляющая последовательность. Смотрите мой ответ.   -  person Peter Hosey    schedule 21.11.2010


Ответы (2)


Символ копирайта — это то, что вы хотели, верно? Согласно вашему вопросу, это то, что вы получили. Так в чем проблема?

(Вот почему магические числа плохи. Я не могу сказать только по вашему коду, какую кодировку 0xa9 вы хотели.)

Если вам интересно, почему написано 169 вместо 251, то это потому, что Java выводит восьмеричную (с основанием 8) escape-последовательность символов, тогда как %d в стандартной библиотеке C, Core Foundation и Foundation выводит значение как десятичный (основание-10). \251 не является двести пятьдесят первым символом. Используйте %o, чтобы напечатать значение в восьмеричном формате, или %x, чтобы напечатать его в шестнадцатеричном формате (с основанием 16). Или используйте режим программирования Calculator.app, чтобы преобразовать 251 из восьмеричной в десятичную.

Кстати, вы можете использовать последовательность формата %@ и функцию NSUserName, чтобы вставить свое имя пользователя в строку, как вы это делали в коде Java. Нет необходимости жестко кодировать его.

person Peter Hosey    schedule 20.11.2010
comment
Спасибо за ответ, но я отлаживаю проблему с хешем MD5 и думал, что это строки, но на самом деле это проблема CC_MD5 UTF8String. - person Jim Geldermann; 21.11.2010

Вам не хватает «s» в «jim[s]Copyright» в версии Objective-C.

person Jens Ayton    schedule 21.11.2010