2010-11-20 29 views
0

我有准备的消息为MD5 Munge时间的NSMutableString stringWithFormat

private static char[] jimsCopyRight = { 

'C', 'O', 'P', 'Y', 'R', 'I',“G java代码','h', 't',':','',0xa9,''};

其在

StringBuffer message = new StringBuffer(); 

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

当我打印出使用

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

的System.out.println(该消息的 “i = ”+ 1 +“ 字符 ”+ message.substring(I,I + 1)+“ 的charAt” + message.charAt(I)); }

我得到I = 14炭\ 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]); 
} 

这事给我,我= 14字符©169

中获得的NSMutableString是相同的StringBuffer可以理解的任何帮助。


的问题是,当我Munge时间两个字符串的MD5中我得到不同的结果,当我加入0xa9。打印只是为了看看字符串。

我在想它与Java中的char []和NSMutableString的构造有关。我不相信他们是相同的价值观。

我有一些C代码,它声明的版权为

#define jimsCopyRight "Copyright: � " 

版权的MD5的Java和C MD5是相同的。

+0

0xa9是169,并且unicode char 169是(c)符号,所以问题真的是,为什么java case想到它的char 251? – superfell 2010-11-20 22:59:50

+0

看来,在你的java情况下,你的输出流不是unicode,你正在查看输出流本身,并且你看到一些不同的编码结果,如果你改变你的循环为 – superfell 2010-11-20 23:03:32

+0

ystem.out.println (“i =”+ i +“char”+ message.substring(i,i + 1)+“charAT”+ Integer.valueOf(message.charAt(i)));你会发现char仍然是codepoint 169(i = 11 char©charAT 169) – superfell 2010-11-20 23:04:01

回答

2

版权符号是你想要的,对吗?根据你的问题,这就是你得到的。所以有什么问题?

(这就是为什么魔术数字是不好的。我不能单独从你的代码,你想要什么编码的0xa9告诉。)

如果你想知道为什么它说的169,而不是251,这是因为Java打印(base-8)字符转义序列,而C标准库,Core Foundation和Foundation中的%d将打印出十进制(基数为10)的值。 \251不是第二百一十五个字。使用%o将值打印为八进制,或%x将其打印为十六进制(基数为16)。或者,使用Calculator.app的编程模式将251从八进制转换为十进制。

顺便说一句,您可以使用%@格式序列和NSUserName函数将您的用户名插入到字符串中,就像您在Java代码中所做的一样。无需对其进行硬编码。

+0

感谢您的答案,但我正在调试MD5哈希问题,我认为这是字符串,但它实际上是一个CC_MD5 UTF8String问题。 – 2010-11-21 14:49:55

0

您在Objective-C版本的“jim [s] Copyright”中缺少“s”。