首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASCII码到NSData

ASCII码到NSData
EN

Stack Overflow用户
提问于 2010-11-25 00:30:50
回答 2查看 2.8K关注 0票数 0

这是我的MD5问题的又一次破解。我知道问题出在ASCII字符©(0xa9,169)。这要么是我在字符串中插入字符的方式,要么是一个高字节与低字节的问题。

如果我

代码语言:javascript
复制
 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©

当我将编码更改为

代码语言:javascript
复制
NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source length]];

结果是

#########源©

数据描述= "<"c2>

md5: 6465dad1d31752be3f3283e8f70feef7

当我将编码更改为

代码语言:javascript
复制
NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];

结果是###############源©len 2数据描述= "<"c2a9>

md5: a541ecda3d4c67f1151cad5075633423

当我在Java中运行相同的函数时,我得到

">>>>> msg## \251 \251

md5 a252c2c85a9e7756d5ba5da9949d57ed

问题是,在objC中获取相同字节的最好方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-28 04:45:13

多亏了GBegan在另一篇文章中的解释,我才得以拼凑起来。

代码语言:javascript
复制
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];

}

票数 1
EN

Stack Overflow用户

发布于 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中),就您而言,您应该将其视为理想字符串。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4269094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档