这是我的MD5问题的又一次破解。我知道问题出在ASCII字符©(0xa9,169)。这要么是我在字符串中插入字符的方式,要么是一个高字节与低字节的问题。
如果我
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]
];结果:
#########源©
数据描述= (null)
md5: d41d8cd98f00b204e9800998ecf8427e
取值: int 169 char©
当我将编码更改为
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中运行相同的函数时,我得到
">>>>> msg## \251 \251
md5 a252c2c85a9e7756d5ba5da9949d57ed
问题是,在objC中获取相同字节的最好方法是什么?
发布于 2010-11-28 04:45:13
多亏了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];}
发布于 2010-11-25 04:36:18
“ASCII”没有任何意义,因为ASCII是一种编码;如果有编码的字符,那么就有数据。
编码是理想的Unicode字符(代码点)到一个或多个字节单元(代码单元)的转换,可能是在UTF-16的代理对之类的序列中。
NSString或多或少是一个理想的Unicode对象。它包含Unicode格式的字符串字符,而不考虑任何编码*。
ASCII是一种编码。UTF-8也是一种编码。当您向字符串请求其UTF8String时,您是在要求它将其字符编码为UTF-8。
NSData *data = [NSData UTF8String dataWithBytes:源数据长度:源长度];
结果是
#########源©数据描述= "<"c2>
那是因为你传递了错误的长度。字符串的长度(以字符为单位)与某些编码中的代码单元数(在本例中为字节)不同。
正确的长度是strlen([source UTF8String]),但是在运行时使用dataUsingEncoding:请求字符串为您创建NSData对象会更容易、更快。
当我将编码更改为
NSData * lengthOfBytesUsingEncoding:NSUTF8StringEncoding];= [NSData dataWithBytes:源数据长度:源lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
你没有改变编码。您仍然将其编码为UTF-8。
使用dataUsingEncoding:。
问题是,在objC中获取相同字节的最好方法是什么?
使用相同的编码。
没有“扩展ASCII”这样的东西。有几种不同的基于ASCII (或至少与ASCII兼容)的编码,包括ISO8859-1、ISO8859-9、MacRoman、Windows codepage 1252和UTF-8。你需要决定你指的是哪一个,并告诉字符串用它来编码它的字符。
更好的是,继续使用UTF-8-它几乎总是大多数ASCII文本的正确选择-并改为更改您的Java代码。
NSData *data =源数据使用编码:NSASCIIStringEncoding;
结果:
数据描述= (null)
True ASCII只能编码128个可能的字符。Unicode包含所有未更改的ASCII,因此Unicode中的前128个代码点是ASCII可以编码的。其他任何内容,ASCII都不能编码。
我以前见过NSASCIIStringEncoding的行为相当于NSISOLatin1StringEncoding;听起来他们可能已经将其更改为纯ASCII码,如果是这样的话,这是一件好事。ASCII中没有版权符号。您在这里看到的是正确的结果。
*这并不完全正确;字符被公开为UTF-16,因此基本多语言平面之外的任何字符都被公开为代理项对,而不是像在真正理想的字符串对象中那样的完整字符。这是一种权衡。在Swift中,内置的String类型是一个完美的理想Unicode对象;字符是字符,在编码之前从不分割。但在使用NSString时(无论是在Swift中还是在Objective-C中),就您而言,您应该将其视为理想字符串。
https://stackoverflow.com/questions/4269094
复制相似问题