![](/img/trans.png)
[英]Converting NSData to NSString in NSURLConnection = null
[英]Null result on Converting NSData to NSString
將NSData
轉換為NSString
時遇到問題。 我正在使用UTF8Enconding
但結果是null
!
這是我收到的數據<100226ab c0a8010b 00000000 00000000>
它必須是192.168.1.11
或192.168.1.17
。
這是我用來轉換的方法:
NSString *ipAddress = [[NSString alloc] initWithData:address encoding:NSUTF8StringEncoding];
有什么不對的嗎?!
順便說一句,這did receive data
了GCDAsyncUdpSocket
庫的did receive data
委托。
從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
這不是字符串響應。 這是二進制數據。 如果考慮<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];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.