0

友達、

おなじみの質問のように見えるかもしれませんが、NSData を他の理解可能な形式に変換するには、本当に助けが必要です。基本的に私はCoreWLANフレームワークを使用しており、CWNetworkはinformationElementを適切に呼び出しており、そのデータ型はNSDataです。他の読み取り可能な形式に変換しようとしましたが、機能しません。利用可能なすべての文字列エンコーディングを試しました。以下はサンプルコードです。

- (void) printNSData:(NSData *) dataToPrint forKey:(NSString *) key{
    for(int i = 1 ; i < 16 ; i++){
               size_t length = [dataToPrint length]+1;
        unsigned char aBuffer[length];
        [dataToPrint getBytes:aBuffer length:length];
        aBuffer[length] = 0;
        NSString *content = [[NSString alloc]  initWithBytes:aBuffer
                                                      length:[dataToPrint length] encoding: i];
        NSLog(@"%@ : %@ ", key,content);
    }
    /*
    NSUTF16BigEndianStringEncoding = 0x90000100,
    NSUTF16LittleEndianStringEncoding = 0x94000100,
    NSUTF32StringEncoding = 0x8c000100,
    NSUTF32BigEndianStringEncoding = 0x98000100,
    NSUTF32LittleEndianStringEncoding = 0x9c000100,
    NSProprietaryStringEncoding = 65536
     */
    NSString *content = [[NSString alloc]  initWithBytes:[dataToPrint bytes]
                                                  length:[dataToPrint length] encoding: NSUTF16BigEndianStringEncoding];
    NSLog(@"%@ : %@ ",key, content);
    content = [[NSString alloc]  initWithBytes:[dataToPrint bytes]
                                        length:[dataToPrint length] encoding: NSUTF16LittleEndianStringEncoding];
    NSLog(@"%@ : %@ ",key, content);

    content = [[NSString alloc]  initWithBytes:[dataToPrint bytes]
                                        length:[dataToPrint length] encoding: NSUTF32StringEncoding];
    NSLog(@"%@ : %@ ", key,content);

    content = [[NSString alloc]  initWithBytes:[dataToPrint bytes]
                                        length:[dataToPrint length] encoding: NSUTF32BigEndianStringEncoding];
    NSLog(@"%@ : %@ ", key,content);

    content = [[NSString alloc]  initWithBytes:[dataToPrint bytes]
                                        length:[dataToPrint length] encoding: NSUTF32LittleEndianStringEncoding];
    NSLog(@"%@ : %@ ", key,content);

    content = [[NSString alloc]  initWithBytes:[dataToPrint bytes]
                                        length:[dataToPrint length] encoding: NSProprietaryStringEncoding];
    NSLog(@"%@ : %@", key,content);

}

しかし、Null または空の応答が返されます。助けてください。

よろしく、国会議員

4

1 に答える 1

0

任意のデータを文字列に変換することはできません。これは、実際に文字列を表すデータに対してのみ機能します。API が NSData オブジェクトを公開する場合、これは通常当てはまりません。

データに何らかの意味を持たせるには、データが何を表しているかを知る必要があります。

見ているだけで構造が理解できるかもしれません。
あなたが投稿した最初の数バイトを見ると、データが適切に構造化されており、恣意的ではないように見えます。

パケットに分割されるデータ シーム。各パケットはタイプ識別子で始まり、その後に $length バイトが続きます。そして、データの $length バイトがあります

最初のパケットには文字列「SYmantak」が含まれています

00 08 53 79 6d 61 6e 74 61 6b
^^ Type Identifier
   ^^ Length
      ^^^^^^^^^^^^^^^^^^^^^^^ Data. In this case the ASCII string "SYmantak"

すべてが 0x20 から 0x7E の間にある一連のバイトを見つけた場合は、おそらく ASCII を見ています。これが基本的に、このパケットのペイロードを把握した方法です。また、ASCII である 8 バイトがあるため、ASCII の前の 0x08 は、8 バイトのデータを意味する可能性が高くなります。

次のパケットは次のようになります。

01 08 82 84 0b 16 24 30 48 6c
^^ Type Identifier
   ^^ Length
      ^^^^^^^^^^^^^^^^^^^^^^^ Data. But not a ASCII string
03 01 06
2a 01 00
2f 01 00
30 14 01 00 00 0f ac 04 01 00 00 0f ac 04 01 00 00 0f ac 02 0c 00 
32 04 0c 12 18 60 
2d 1a 6e 18 1b ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

等々。一般的なパケット構造は非常に簡単に解析できます。
これらのバイトを意味のあるデータに変換するのは非常に困難ですが。他のパケットからわかるように、ASCII を含む最初のパケットほど簡単ではありません。

しかし、この迅速なリバース エンジニアリング構造を当然のことと考えないでください。これらのフィールドの意味については、完全に間違っている可能性があります。

このデータの仕様を見つけようとする必要があります。IEEE 802.11 ドキュメントのどこかにあるはずです。

于 2013-09-04T15:20:23.497 に答える