簡體   English   中英

將NSData轉換為NSString時出現空結果

[英]Null result on Converting NSData to NSString

NSData轉換為NSString時遇到問題。 我正在使用UTF8Enconding但結果是null

這是我收到的數據<100226ab c0a8010b 00000000 00000000>它必須是192.168.1.11192.168.1.17

這是我用來轉換的方法:

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

有什么不對的嗎?!

順便說一句,這did receive dataGCDAsyncUdpSocket庫的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>coa8010bc0十六進制等於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM