2012-02-08 80 views
0

执行转换后,我收到了奇怪的NSString值。例如,我有一个值为2(00000010)的字节,存储在响应中。我尝试了NSString initWithData和initWithBytes,但都返回怪异符号(倒过来的问号)。这里是我的代码:如何正确地从NSData转换为NSString?

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

你期望什么?值为'2'的字节是STX或文本的开始。你想从这个字节中得到什么? – 2012-02-08 14:32:16

+1

你期望得到什么? ascii表中最多32个空格的所有字符都被认为是控制字符,它们没有像样的表示。 – Eimantas 2012-02-08 14:33:29

+0

来的响应是编码为字节的数字。因此,例如,我需要从00000010解析2。 – Centurion 2012-02-08 14:36:09

回答

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; 
} 

它只是每个字节到它的整数表示只是转换并连接到这一个字符串。

1

ASCII不一定是正确的编码。 ASCII只定义了0x000x7F之间的字符。如果响应是HTTP响应,而不是在HTTP Content-Type头指定的编码,默认是ISO-8859-1,你应该使用NSISOLatin1StringEncoding

而且这不会不管你使用哪种编码:控制字符(0x00 - 0x1F)不一定是可打印的。