Невозможно преобразовать NSData в NSString или любой другой формат информации ElementData CWNetwork

Друзья,

Это может выглядеть как знакомый вопрос, но мне действительно нужна помощь для преобразования 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);

}

Но я получаю либо нулевой, либо пустой ответ. Пожалуйста, пожалуйста, помогите.

С уважением, МП

1 ответ

Решение

Вы не можете конвертировать произвольные данные в строку. Это работает только для данных, которые фактически представляют строку. Как правило, это не тот случай, если API предоставляет объект NSData.

Чтобы получить некоторое значение в данных, вы должны знать, что эти данные представляют.

Возможно, вы сможете получить некоторую структуру, просто взглянув на нее.
Если я посмотрю первые несколько байтов, которые вы опубликовали, похоже, что данные хорошо структурированы и не являются произвольными.

Швы данных должны быть разбиты на пакеты. Каждый пакет начинается с идентификатора типа, за которым следует байт $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. Вот так я и выяснил полезную нагрузку этого пакета. И поскольку у нас есть 8 байтов, которые являются ASCII, то 0x08 перед ASCII, скорее всего, означает 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.

Другие вопросы по тегам