Objective c 将NSData转换为NSString时的空结果

Objective c 将NSData转换为NSString时的空结果,objective-c,ios,asyncsocket,Objective C,Ios,Asyncsocket,将NSData转换为NSString时,我遇到了一个问题。我使用的是UTF8Enconding,但结果是null 这是我收到的数据它必须是192.168.1.11或192.168.1.17 这是我用来转换的方法: NSString *ipAddress = [[NSString alloc] initWithData:address encoding:NSUTF8StringEncoding]; 有什么不对劲吗 顺便说一下,确实收到了GCDAsyncUdpSocket库的数据。我想编码有问题

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

这是我收到的数据
它必须是
192.168.1.11
192.168.1.17

这是我用来转换的方法:

 NSString *ipAddress = [[NSString alloc] initWithData:address encoding:NSUTF8StringEncoding];
有什么不对劲吗


顺便说一下,
确实收到了
GCDAsyncUdpSocket
库的数据。

我想编码有问题。我也面临类似问题,并通过以下方式解决:

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

GCDAsyncUdpSocket
的文档中:

localAddress
方法返回封装在 NSData对象

以下代码将数据展开为,并将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);
#包括
#包括
NSData*数据=…;//你的数据
NSLog(@“数据=%@”,数据);
//将数据复制到“sockaddr_存储”结构。
结构sockaddr_存储sa;
socklen_t salen=sizeof(sa);
[数据获取字节:&sa长度:salen];
//以C字符串形式从套接字地址获取主机:
字符主机[NI_MAXHOST];
getnameinfo((struct sockaddr*)&sa,salen,host,sizeof(host),NULL,0,NI_numericost);
//将C字符串转换为NSString:
NSString*ipAddress=[[NSString alloc]initWithBytes:主机长度:strlen(主机)编码:NSUTF8StringEncoding];
NSLog(@“strAddr=%@”,ipAddress);
输出:

数据=
strAddr=192.168.1.11

这不是字符串响应。这是二进制数据。如果考虑<代码> <代码>,请看<代码> COA8010B <代码>:<十六进制中的代码> C0<代码>等于十进制中的192,<代码> A8< /代码>=168,<代码> 01 =1,和<代码> 0B < /代码>=11。简而言之,这是192.168.1.11的二进制表示,而不是字符串表示


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

找到了一种更快的方法,使用
inet\u ntoa()


您是否检查了nslogging
address
它是否包含任何内容?是的,就像我说的,它引用了这个@Danialzo:请检查我的答案,并说您是否以类似的方式执行此操作返回一些无意义的字符--见下文ဂ⚫삨ċ请检查这个答案,我引用这个来解决我的问题:Danialzo的数据不是字符串。这是二进制数据。@Danialzo:不客气,祝大家圣诞快乐!
#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
//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];