这是在我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的工作时,就你而言,你应该把它看作一个理想的字符串。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top