3

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

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

これは文字列応答ではありません。これはバイナリデータです。を検討する場合は、16 進数の:が 10 進数の 192、= 168、= 1、および= 11 に等しいことを<100226ab c0a8010b 00000000 00000000>確認してください。要するに、これは 192.168.1.11 の文字列表現ではなく、2 進数表現です。coa8010bc0a8010b

取得する応答の性質については、ドキュメントをより注意深く調べて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 に答える
-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 に答える