2012-12-26 69 views
3

NSData轉換爲NSString時,我遇到問題。我正在使用UTF8Enconding,但結果是null將NSData轉換爲NSString的結果爲空

這是我收到的數據<100226ab c0a8010b 00000000 00000000>它必須是192.168.1.11192.168.1.17

這是我使用轉換的方法:

NSString *ipAddress = [[NSString alloc] initWithData:address encoding:NSUTF8StringEncoding]; 

這有什麼錯?

順便說一下,這個did receive data代表GCDAsyncUdpSocket庫。

+0

你檢查nslogging'address'是含有什麼呢? –

+0

是的,就像我說的,它的<100226ab c0a8010b 00000000 00000000> – Danialzo

+0

參考這個http://stackoverflow.com/questions/2467844/convert-utf-8-encoded-nsdata-to-nsstring – zahreelay

回答

4

GCDAsyncUdpSocket文檔:

localAddress方法返回包裝在 NSData對象sockaddr結構體。

以下代碼將數據解開爲sockaddr structure並將IP地址轉換爲NSString。它適用於IPv4和IPv6地址。

#include <sys/socket.h> 
#include <netdb.h> 

NSData *data = ...; // your data 
NSLog(@"data = %@", data); 

// Copy data to a "sockaddr_storage" structure. 
struct sockaddr_storage sa; 
socklen_t salen = sizeof(sa); 
[data getBytes:&sa length:salen]; 

// Get host from socket address as C string: 
char host[NI_MAXHOST]; 
getnameinfo((struct sockaddr *)&sa, salen, host, sizeof(host), NULL, 0, NI_NUMERICHOST); 

// Convert C string to NSString: 
NSString *ipAddress = [[NSString alloc] initWithBytes:host length:strlen(host) encoding:NSUTF8StringEncoding]; 
NSLog(@"strAddr = %@", ipAddress); 

輸出:

data = <100226ab c0a8010b 00000000 00000000> 
strAddr = 192.168.1.11 
+0

欣賞你的答案 – Danialzo

+1

@Danialzo:不客氣,聖誕快樂給大家! –

0

我想編碼有問題。我也面臨類似的問題,並解決了由:

NSString *responseString =[[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUnicodeStringEncoding]; 
+0

這回歸一些廢話字符 - 見下面 ဂ⚫삨ċ – Danialzo

+0

請檢查這個答案我已經提到這個來解決我的問題:http:// stackoverflow。 com/questions/10178936/nsdata-to-nsstring-returns-null –

+0

Danialzo的數據不是字符串,它是二進制數據 – Rob

-1
First try with other encoding formats available 

1. NSASCIIStringEncoding 
2. NSMacOSRomanStringEncoding 
3. NSShiftJISStringEncoding. 

even if it not works,try like the following ways 

1. NSData *data = [NSData dataWithContentsOfURL:URL]; 
// Assuming data is in UTF8. 
NSString *string = [NSString stringWithUTF8String:[data bytes]]; 

2. This is like as you done. 

// if data is in another encoding, for example ISO-8859-1 
NSString *string = [[NSString alloc] 
      initWithData:data encoding: NSISOLatin1StringEncoding]; 
2

這不是一個串響應。這是二進制數據。如果考慮<100226ab c0a8010b 00000000 00000000>,請查看coa8010bc0(十六進制等於192十進制),a8 = 168,01 = 1和0b = 11.簡而言之,這是一個192.168的二進制表示形式,而不是字符串表示形式。 1.11。

您可能需要更仔細地檢查GCDAsyncUdpSocket文檔以瞭解您應該得到的響應性質,因爲它顯然是二進制數據,而不是字符串。

+0

非常感謝。你是絕對正確的。 – Danialzo

0

找到一個更快的方式做到這一點,利用inet_ntoa()

//Get the bytes from the data and cast it to the correct struct 
struct sockaddr_in *addr = (struct sockaddr_in *)[address bytes]; 
//inet_ntoa converts from the binary format to a C string 
NSString *IP = [NSString stringWithCString:inet_ntoa(addr->sin_addr) encoding:NSASCIIStringEncoding];