将 NSData 转换为 NSString 的空结果

Posted

技术标签:

【中文标题】将 NSData 转换为 NSString 的空结果【英文标题】:Null result on Converting NSData to NSString 【发布时间】:2012-12-26 07:04:53 【问题描述】:

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 代表。

【问题讨论】:

你检查过 nslogging address 是否包含任何内容? 是的,就像我说的,它的 参考这个***.com/questions/2467844/… @Danialzo:请检查我的答案,并说你是否在做类似的方式 【参考方案1】:

来自GCDAsyncUdpSocket的文档:

localAddress 方法返回一个包裹在 NSData 对象。

以下代码将数据解包为sockaddr structure,并将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

【讨论】:

@Danialzo:不客气,祝大家圣诞快乐!【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

这会返回一些无意义的字符——见下文ဂ⚫삨ċ 请检查这个答案我已经提到这个来解决我的问题:***.com/questions/10178936/… Danialzo 的数据不是字符串。这是二进制数据。【参考方案4】:

找到了一种更快的方法,使用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];

【讨论】:

【参考方案5】:
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];

【讨论】:

以上是关于将 NSData 转换为 NSString 的空结果的主要内容,如果未能解决你的问题,请参考以下文章

将 NSData 转换为 NSString 并再次转换为 NSData?

如何将NSString值转换为NSData?

将 NSData 转换为 NSString 返回 nil

将 NSString 转换为 NSData 是不是会强制使用尾随字节?

将 UTF-8 编码的 NSData 转换为 NSString

将 NSData 转换为 Hex NSString