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()
:
您是否检查了nsloggingaddress
它是否包含任何内容?是的,就像我说的,它引用了这个@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];