将 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.11
或192.168.1.17
。
这是我用来转换的方法:
NSString *ipAddress = [[NSString alloc] initWithData:address encoding:NSUTF8StringEncoding];
有什么问题吗?!
顺便说一下,这是GCDAsyncUdpSocket
库的did receive data
代表。
【问题讨论】:
你检查过 nsloggingaddress
是否包含任何内容?
是的,就像我说的,它的
参考这个***.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】:这不是字符串响应。这是二进制数据。如果你考虑<100226ab c0a8010b 00000000 00000000>
,看看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 是不是会强制使用尾随字节?