Cocoa ASCII到NSData

Cocoa ASCII到NSData,cocoa,nsdata,extended-ascii,Cocoa,Nsdata,Extended Ascii,这是我的MD5问题的另一个漏洞。我知道问题出在ASCII字符©上(0xa9,169)。要么是我将字符插入字符串的方式,要么是高字节对低字节的问题 如果我 结果: [data description] = (null) #########资料来源( [数据描述]=(空) md5:d41d8cd98f00b204e9800998ecf8427e 值:int 169字符© 当我将编码更改为 NSData *data = [NSData dataWithBytes:[source UTF8String

这是我的MD5问题的另一个漏洞。我知道问题出在ASCII字符©上(0xa9,169)。要么是我将字符插入字符串的方式,要么是高字节对低字节的问题

如果我

结果:

[data description] = (null)
#########资料来源( [数据描述]=(空)
md5:d41d8cd98f00b204e9800998ecf8427e

值:int 169字符©

当我将编码更改为

NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source length]];
NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];
结果是

 ######### source ©
 [data description] = "<"c2>
#########资料来源( [数据描述]=“>>>>消息##\251\251
md5 a252c2c85a9e7756d5ba5da9949d57ed


问题是,在objC中获得与在Java中相同字节的最佳方法是什么?

“ASCII到NSData”毫无意义,因为ASCII是一种编码;如果您有编码字符,那么您就有数据

编码是将理想的Unicode字符(代码点)转换为一个或多个字节单元(代码单元),可能是UTF-16的代理项对等序列

NSString或多或少是一个理想的Unicode对象。它以Unicode格式包含字符串的字符,而不考虑任何编码*

ASCII是一种编码方式。UTF-8也是一种编码方式。当您要求字符串输入其
UTF8String
时,您要求它将其字符编码为UTF-8

结果是

 ######### source ©
 [data description] = "<"c2>
您没有更改编码。您仍然将其编码为UTF-8

使用
数据使用编码:

问题是,在objC中获得与在Java中相同字节的最佳方法是什么

使用相同的编码

没有“扩展ASCII”这样的东西。有几种不同的编码是基于(或至少兼容)ASCII的,包括ISO 8859-1、ISO 8859-9、MacRoman、Windows代码页1252和UTF-8。您需要确定您指的是哪种编码,并告诉字符串用它来编码其字符

更好的是,继续使用UTF-8——对于大部分ASCII文本来说,它几乎总是正确的选择,而改为使用Java代码

结果:

[data description] = (null)
真正的ASCII只能对128个可能的字符进行编码。Unicode包含所有未更改的ASCII,因此Unicode中的前128个代码点是ASCII可以编码的。任何其他内容,ASCII都无法编码

我以前见过
nsascistringencoding
的行为相当于
NSISOLatin1StringEncoding
;听起来他们可能已经将其更改为纯ASCII编码,如果是这样的话,这是一件好事。ASCII中没有版权符号。您在这里看到的是正确的结果



*这是不完全正确的;字符以UTF-16的形式公开,因此基本多语言平面之外的任何字符都以代理项对的形式公开,而不是像在真正理想的字符串对象中那样公开整个字符。这是一种折衷。在Swift中,内置字符串类型是一个完美的Unicode对象;字符是字符,而不是di但是当使用NSString(无论是在Swift中还是在Objective-C中)时,就您而言,您应该将其视为理想的字符串。

多亏了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];
for(int c=0;c<[s长度];c++){
整数=[s characterAtIndex:c];
无符号字符c[1];
c[0]=(无符号字符)编号;
NSMutableData*oneByte=[NSMutableData dataWithBytes:&c长度:1];

}

你不需要发送一个对象“代码>描述< /Cord>消息,然后将它传递给<代码> %@ 。<代码> %@ < /Cord>格式化程序向你发送对象A代码>描述< /代码>消息。你可以考虑阅读来获取字符和字节之间的差异的基础知识。是的,我慢慢意识到我的DIL的考验。emma。问题在于Java 0xa9用于MD5哈希,我得到的结果与服务器产生的结果相同。我首先将Java移植到iPhone的objC,然后再移植到OSX。我的目标是向CC_MD5发送一个字节,该字节将给我与Java和服务器结果相等的结果。到那时,我相信我的整个哈希问题将得到解决。这个问题Jim:问题是当
0xa9
是一个字节时,你假装它是一个字符。解决方法是在Java代码中说出
0xa9
时,找出你所指的字符,然后找出哪个编码将该字符转换为单字节
0xa9,然后在代码中使用该字符和该编码。
[data description] = (null)
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];