2012-02-08 75 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)不一定是可打印的。