2012-04-16 348 views
13

我已經搜索過。但仍然無法得到它。NSData返回NSString Null

我正在將NSdata轉換爲NSString。 當我做[data description]; 它返回我< 00000000 31323334 35363738> 是的,我收到我的字符串@「12345678」。

如何正確地將它轉換爲NSString? 我試過

NSString *b = [NSString stringWithUTF8String:[data bytes]]; 
NSString *a = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUTF8StringEncoding]; 

兩者都返回空。 有什麼想法? 謝謝

大家好, 謝謝你的所有建議。 它似乎是不變的,因爲它總是一個空角色infront。 所以每當我收到東西,我只是刪除第一個< 00000000>,那麼它已經正常工作

+0

在SO搜索將得到您的答案 – SomaMan 2012-04-16 17:51:49

+0

您好,我該如何接受人們的答案?我嘗試點擊向上鍵,但它說我需要超過15的聲譽 – user774150 2012-04-17 02:28:21

回答

26

如果編碼不正確,會發生這種情況。

嘗試使用ASCII碼進行測試。 ASCII幾乎肯定能夠檢索一些字符串。如果它只是數字,它可能會工作。

NSString *a = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSASCIIStringEncoding]; 

最常見的除了UTF-8 enconding是:

NSASCIIStringEncoding 
NSUnicodeStringEncoding 
NSISOLatin1StringEncoding 
NSISOLatin2StringEncoding 
NSSymbolStringEncoding 

嘗試出來,看看他們的工作。

+1

NSASCIIStringEncoding爲我工作。謝謝。 – 2015-09-19 14:09:44

6

我將NSdata轉換爲NSString。當我做[數據說明];它 返回我< 00000000 31323334 35363738>是的,我收到我的字符串 @「12345678」。

否 - 您沒有收到該字符串。您正在接收一個以一串0x00值開始的字節序列,後面緊跟着一系列與ASCII序列「12345678」相對應的字節。

I.e.你有原始數據,並試圖將其轉換爲受限類型,但不能,因爲約束類型不能表示原始數據。

您可以嘗試在NSString上使用「有損轉換」API,但這可能無法正常工作,並且無論如何都會變得脆弱。

最佳投注?

只將實際表示字符串的NSData中的字節轉換爲NSString的實例。這可以通過-initWithBytes:length:encoding:來完成;您需要進行計算以找到正確的偏移量和長度。

2

這可能是因爲您的數據的第一個字節是00.字符0是字符串字符的結尾。當從ASCII(從字符數組或字節數組)創建一個字符串時,如果在開始時遇到字符0,它將生成一個空字符串。

但我期望它返回一個NSString的實例,它包含0個字符,而不是null。

+1

如果一個字符串是一個C字符串,那麼該字符串僅以'0x00'結尾。對於其他字符串類型,它們通常表示爲編碼,長度和數據的三倍。 NSString就是這種情況; 0x00's不會欺騙它,認爲字符串被終止,它們正在觸發錯誤,因爲0x00是字符串中沒有意義的字節序列。 – bbum 2012-04-16 19:32:02