将NSData转换为NSString的结果为空

NSData转换为NSString时遇到了一个问题。 我正在使用UTF8Enconding但结果为null

这是我收到的数据<100226ab c0a8010b 00000000 00000000>它必须是192.168.1.11192.168.1.17

这是我用来转换的方法:

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

有什么不对的吗?!

顺便说一下,这个did receive dataGCDAsyncUdpSocket库的did receive data委托。

GCDAsyncUdpSocket的文档:

localAddress方法返回一个包装在NSData对象中的sockaddr结构。

以下代码将数据解包到sockaddr结构 ,并将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 

这不是一个string响应。 这是二进制数据。 如果考虑<100226ab c0a8010b 00000000 00000000> ,看看coa8010b :hex中的c0等于十进制中的192, a8 = coa8010b = 11。简言之,这是一个二进制表示,而不是一个string代表性,192.168.1.11。

您可能需要更仔细地检查GCDAsyncUdpSocket文档以了解您应该得到的响应的性质,因为它显然是二进制数据,而不是string。

我猜这是编码问题。 我也面临类似的问题,并通过以下解决:

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

使用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]; 
 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];