题
这是在我MD5问题另一个裂缝。我知道这个问题是与ASCII字符©(0xa9,169)。要么是我将所述字符到字符串或它的更高的VS低字节问题的方式。
如果我
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]
];
结果:
#########来源©[数据描述] =(空),点击 MD5:d41d8cd98f00b204e9800998ecf8427e
值:INT 169炭©
当我改变编码
NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source length]];
的结果是
#########来源©[数据描述] = “<” C2>结果 MD5:6465dad1d31752be3f3283e8f70feef7
当我改变编码
NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];
其结果是 ###############源©LEN 2 [数据描述] = “<” c2a9>结果 MD5:a541ecda3d4c67f1151cad5075633423
当我运行在Java中予相同功能的get
“>>>>> MSG ## \ 251 \ 251,点击 MD5 a252c2c85a9e7756d5ba5da9949d57ed
现在的问题是什么,因为我在Java中去获得objC相同的字节的最佳方式?
解决方案 2
由于GBegan在另一篇文章的解释,我能够凑齐了一起。
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];
}
其他提示
“ASCII到NSData的”是没有意义的,因为ASCII是编码;如果已编码的字符,那么你有数据。
的编码是理想的Unicode字符(码点)变换成一个或更多的字节单位(编码单元),有可能在诸如UTF-16的替代品对序列。
一个NSString或多或少是一个理想的Unicode对象。它包含的字符的字符串,以Unicode,无论任何编码的*。
ASCII是一种编码。 UTF-8也是一种编码。当你问其UTF8String
字符串,你正在要求它编码它的字符为UTF-8。
NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source length]];
的结果是
######### source © [data description] = "<"c2>
这是因为你传递了错误的长度。字符串的长度(字符数)是不一样的代码单位(字节,在这种情况下)在一些编码的数目。
在正确的长度是strlen([source UTF8String])
,但它为你更容易,并在运行时更快地使用dataUsingEncoding:
问字符串创建的NSData对象适合你。
当我改变编码
NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];
您没有更改编码。你还在其编码为UTF-8。
使用dataUsingEncoding:
。
现在的问题是什么,因为我在Java中去获得objC相同的字节的最佳方式?
使用相同的编码。
有作为“扩展的ASCII”没有这样的事。但是也有一些基于(或者至少应兼容)ASCII,包括ISO 8859-1,ISO 8859-9,的MacRoman时,Windows代码页1252和UTF-8几种不同的编码。你需要决定你的意思,并告诉该字符串与编码它的字符其中之一。
更重要的是,继续使用UTF-8,它几乎总是正确的选择大多-ASCII文本,改变你的Java代码来代替。
NSData *data = [source dataUsingEncoding:NSASCIIStringEncoding];
结果:
[data description] = (null)
真ASCII只能编码128个可能的字符。 Unicode的包括所有ASCII不变的,所以在Unicode中的前128个码点什么ASCII可以编码。别的,ASCII不能编码
我看到NSASCIIStringEncoding
表现为等同于之前NSISOLatin1StringEncoding
;这听起来像他们可能已经改变了它是一个纯粹的ASCII编码,如果是这样的话,这是一件好事。有一个在ASCII没有版权的象征。你在这里看到的是正确的结果。
*这是并不完全正确;人物公开为UTF-16,所以基本多文种平面以外的任何字符被公开为代理对,不完整字符,因为他们将在一个真正理想的字符串对象。这是一个权衡。在斯威夫特,内置的字符串类型是一个完美的理想Unicode的对象;字符的字符,从来没有分开,直到编码。但是,(在斯威夫特或者在Objective-C是否)与NSString的工作时,就你而言,你应该把它看作一个理想的字符串。