如何从NSData正确转换为NSString?

时间:2012-02-08 14:26:49

标签: iphone objective-c cocoa-touch nsdata

执行转换后,我得到了奇怪的NSString值。例如,我有一个值为2(00000010)的字节存储在响应中。我尝试了NSString initWithData和initWithBytes,但都返回了奇怪的符号(颠倒的问号)。这是我的代码:

NSString *command1 = [[NSString alloc] initWithData:response encoding:NSASCIIStringEncoding];
NSString *command2 = [[NSString alloc] initWithBytes:[response bytes] length:[response length] encoding:NSASCIIStringEncoding];

NSLog(@"command1: %@", command1);
NSLog(@"command2: %@", command2);

还尝试了NSUTF8StringEncoding,但NSASCIIStringEncoding是正确的,因为数据每个符号编码一个字节。

2 个答案:

答案 0 :(得分:1)

ASCII不一定是正确的编码。 ASCII仅定义0x000x7F之间的字符。如果响应是HTTP响应,并且未在HTTP Content-Type标头中指定编码,则默认为ISO-8859-1,您应使用NSISOLatin1StringEncoding

使用的编码无关紧要:控制字符(0x00 - 0x1F)不一定是可打印的。

答案 1 :(得分:1)

从我正在阅读的内容来看,这就是你想要的:

NSString *stringWithContentsOfBinaryData(NSData *data)
{
    NSMutableString *output;

    int len = [data length];
    uint8_t *bytes = [data bytes];
    for (int i = 0; i < len; i++)
    {
        [output appendFormat:@"%i", bytes[i]];
    } 

    return output;
}

它只是简单地将每个字节转换为它的整数表示形式,并将其连接成一个字符串。