2012-12-26 33 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];