我在将NSData
转换为NSString
时面临一个问题。我使用UTF8Enconding
,但结果是null
!!
这是我接收<100226ab c0a8010b 00000000 00000000>
的数据,它必须是192.168.1.11
或192.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];