3

转换NSDataNSString. 我正在使用UTF8Enconding,但结果是null

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

这是我用来转换的方法:

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

有什么不对的吗?!

顺便说一句,这是图书馆的did receive data代表。GCDAsyncUdpSocket

4

5 回答 5

4

从以下文档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
于 2012-12-26T09:12:43.443 回答
2

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

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

于 2012-12-26T09:17:27.597 回答
0

我猜编码有问题。我也遇到过类似的问题并通过以下方式解决:

NSString *responseString =[[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUnicodeStringEncoding];
于 2012-12-26T07:11:46.283 回答
0

使用以下方法找到了一种更快的方法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];
于 2013-08-01T13:29:34.783 回答
-1
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];
于 2012-12-26T07:18:43.600 回答