目标C语言 转换NSData到NSString的Null结果



我在将NSData转换为NSString时面临一个问题。我使用UTF8Enconding,但结果是null !!

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

这是我用来转换的方法:
 NSString *ipAddress = [[NSString alloc] initWithData:address encoding:NSUTF8StringEncoding];

有什么问题吗?!

顺便说一下,这是GCDAsyncUdpSocket库的did receive data委托。

来自GCDAsyncUdpSocket的文档:

localAddress方法返回一个sockaddr结构NSData对象。

下面的代码将数据解包装为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

这不是字符串响应。这是二进制数据。如果考虑<100226ab c0a8010b 00000000 00000000>,请查看coa8010b:十六进制的c0等于十进制的192,a8 = 168, 01 = 1, 0b = 11。简而言之,这是192.168.1.11的二进制表示,而不是字符串表示。

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

我猜编码有问题。我也遇到过类似的问题,解决方法是:

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

最新更新