Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法将NSData转换为NSString或CWNetwork的informationElementData的任何其他格式_Ios_Objective C_Macos_Wireless_Coocox - Fatal编程技术网

Ios 无法将NSData转换为NSString或CWNetwork的informationElementData的任何其他格式

Ios 无法将NSData转换为NSString或CWNetwork的informationElementData的任何其他格式,ios,objective-c,macos,wireless,coocox,Ios,Objective C,Macos,Wireless,Coocox,朋友们 这看起来像是一个熟悉的问题,但我确实需要帮助将NSData转换为任何其他可以理解的形式。基本上我使用的是CoreWLAN框架,CWNetwork正确地调用了informationElement,它的数据类型是NSData。我尝试将其转换为任何其他可读格式,但不起作用。我尝试了所有可用的字符串编码。下面是示例代码: - (void) printNSData:(NSData *) dataToPrint forKey:(NSString *) key{ for(int i = 1 ;

朋友们

这看起来像是一个熟悉的问题,但我确实需要帮助将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);

}
-(void)printNSData:(NSData*)dataToPrint forKey:(NSString*)键{
对于(int i=1;i<16;i++){
大小\u t长度=[DataTopPrint长度]+1;
无符号字符aBuffer[长度];
[dataToPrint getBytes:aBuffer长度:长度];
阿布弗[长度]=0;
NSString*content=[[NSString alloc]initWithBytes:aBuffer
长度:[DataTopPrint length]编码:i];
NSLog(@“%@:%@”,键,内容);
}
/*
NSUTF16BigEndianStringEncoding=0x90000100,
NSUTF16LittleEndianStringEncoding=0x94000100,
NSUTF32StringEncoding=0x8c000100,
NSUTF32BigEndianStringEncoding=0x98000100,
NSUTF32LittleEndianStringEncoding=0x9c000100,
NSProprietaryStringEncoding=65536
*/
NSString*content=[[NSString alloc]initWithBytes:[dataToPrint bytes]
长度:[DataTopPrint length]编码:NSUTF16BigEndianStringEncoding];
NSLog(@“%@:%@”,键,内容);
content=[[NSString alloc]initWithBytes:[dataToPrint bytes]
长度:[dataToPrint length]编码:NSUTF16LittleEndianStringEncoding];
NSLog(@“%@:%@”,键,内容);
content=[[NSString alloc]initWithBytes:[dataToPrint bytes]
长度:[DataTopPrint length]编码:NSUTF32StringEncoding];
NSLog(@“%@:%@”,键,内容);
content=[[NSString alloc]initWithBytes:[dataToPrint bytes]
长度:[DataTopPrint length]编码:NSUTF32BigEndianStringEncoding];
NSLog(@“%@:%@”,键,内容);
content=[[NSString alloc]initWithBytes:[dataToPrint bytes]
长度:[DataTopPrint length]编码:NSUTf32LittleEndianStringCodeing];
NSLog(@“%@:%@”,键,内容);
content=[[NSString alloc]initWithBytes:[dataToPrint bytes]
长度:[DataTopPrint length]编码:NSProprietaryStringEncoding];
NSLog(@“%@:%@”,键,内容);
}
但我得到的不是空的就是空的响应。请帮忙

问候,,
MP

您不能将任意数据转换为字符串。这只适用于实际表示字符串的数据。如果API公开了NSData对象,则通常不是这种情况

要使数据具有某种意义,您必须知道数据代表什么

您可以通过简单地查看它来获得一些结构。
如果我看一下您发布的前几个字节,看起来数据结构良好,不是任意的

要拆分为数据包的数据接缝。每个数据包都以一个类型标识符开头,后跟一个$length字节。然后将有$length字节的数据

第一个数据包包含字符串“SYmantak”

如果您发现一组字节都位于0x20和0x7E之间,那么您可能正在查看ASCII。基本上我就是这样计算出这个包的有效载荷的。因为我们有8个ASCII字节,所以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文档中的某个地方

数据是什么样子的?不能将任意二进制字节序列转换为字符串。如果字节序列在给定编码中无效,转换将失败。informationElement不是字符串。并非所有NSData都可以转换为NSString。如果
informationElement
包含一个NSString,苹果很可能会在API中将其作为NSString公开。IEEE 802.11标准中应具体规定哪些信息元素。根据doc:信标或探测器响应帧中包含的信息元素数据,因此我认为这些是包含一些物理层信息的字节。在下一条注释中添加NSData的说明。以下是确切的0D16000000000000000000000000000000000000000000DD7F00 50f20410 4a000110 10440001 02104100 0100103b 00010310 470010cc af29d32e dd686efd 82ccfff1 ad91ff10 21000d4e 45544745 41522c20 496e632e 10230009 57475236 31347631 30104400 09574752 36313476 31301042 000533 32353810 54000800060050f2 04000110 11000957 47523631 34763130 10080002 0084dd09 00101802 02f00500 DD1800 50f20201 01800003 a4000027 a4000042 435e0062 322F000DD 1e00904c 336e181b FF000000000000000000000000000000000000000000000000000000000000000000 DD 1a00904c 34060D16000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000>那么您希望如何将该数据表示为字符串?谢谢很你解释得很好,是的,“Symantak”是网络的SSID。我将研究其他解码方法,也将研究IEEE规范。我能够获得这些原始数据的详细信息。我还使用数据包分析(wireshark)进行了验证,发现01 08 82 84 0b 16 24 30 48 6c基本上是01=第二段,08=再次长度,82 84 0b 16 24 30 48 6c分别是1,2,5.511,18,24,36,54。我也能够从NSData中获取这些字节,但是当
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