2013-07-14 2 views
1

J'utilise BTLE pour écrire des données dans l'une des caractéristiques de périphériques. Je voulais envoyer un NSDictionary dans ces caractéristiques. Comme il y a une limite de 130 octets de données envoyées sur BTLE, je veux un moyen efficace de compresser NSDictionary en NSData, puis envoyer à travers. J'utilise ci-dessous un morceau de code qui dépasse la limite. Des idées?Une manière efficace de compresser NSDictionary dans NSData

NSDictionary *aDict = @{ @"Value1": @"sadsadasdasdsadqwwqsadasd", 
         @"Value2": @"10", 
         @"Value3": @"12" }; 
NSData *aData = [NSKeyedArchiver archivedDataWithRootObject:aDict]; 
NSLog(@"Data Size = %@", 
     [NSByteCountFormatter stringFromByteCount:aData.length 
             countStyle:NSByteCountFormatterCountStyleFile]); 
+0

Vérifiez cela. Cela devrait aider. http: // stackoverflow.com/questions/3157356/converting-nsdictionary-object-à-nsdata-object-et-vice-versa –

+0

Vous pouvez essayer de compresser le NSData comme décrit ici: http://stackoverflow.com/a/234099/475052 –

+0

Don Je ne sais pas quelle représentation utilise NSKeyedArchiver - probablement JSON serait plus compact. Dans tous les cas, il n'y aura probablement pas beaucoup de «gaz» dans la représentation, vous devrez donc recourir à la compression de données si vous voulez vraiment regrouper les choses. –

Répondre

6

Je ne pense pas essayer d'utiliser toute forme de compression sera efficace, voire une amélioration du tout à cette échelle, parce que tous les algorithmes de compression fonctionnent mieux quand ils ont beaucoup de données pour travailler avec, et donc de nombreux doublons et modèles à trouver. Lorsque la totalité de votre taille de données est de 130 octets, toute forme de compression zip n'est pas vraiment une option viable.


Si votre dictionnaire ne contient que des valeurs de liste des propriétés (tableaux, des dictionnaires, des chaînes, nombres), vous pouvez utiliser sérialisation JSON au lieu de NSKeyedArchiver:

NSData *JSONData = [NSJSONSerialization dataWithJSONObject:anObject 
                options:0 
                error:nil]; 

Cela rend immédiatement les données de sortie beaucoup plus court dans votre cas:

NSDictionary *aDict = @{ @"Value1": @"sadsadasdasdsadqwwqsadasd", 
         @"Value2": @"10", 
         @"Value3": @"12" }; 

NSData *aData = [NSKeyedArchiver archivedDataWithRootObject:aDict]; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:aDict 
                options:0 
                error:nil]; 

NSLog(@"NSKeyedArchiver Data Size = %@, JSON Data Size = %@", 
     [NSByteCountFormatter stringFromByteCount:aData.length 
            countStyle:NSByteCountFormatterCountStyleFile], 
     [NSByteCountFormatter stringFromByteCount:jsonData.length 
            countStyle:NSByteCountFormatterCountStyleFile] 
    ); 

NSKeyedArchiver Taille Data = 380 octets, JSON Taille de données = 66 octets

Comme vous pouvez le voir, les données sérialisé JSON est presque 6 fois plus petit que les NSKeyedArchiver données sérialisés, et se glisse facilement dans votre limite de 130 octets. Et la meilleure chose est, c'est seulement une ligne de code.

MISE À JOUR: Il suffit de se frotter dans un peu plus :), voici les données qui NSKeyedArchiver produit (ajouté sous forme d'image, car il contient beaucoup de caractères « illégaux » que je ne pouvais pas copier et coller):

NSKeyedArchiver Data

Comme vous pouvez le voir, il contient beaucoup de données inutiles que vous avez vraiment pas besoin (surligné en bleu), qui est fondamentalement juste de donner NSKeyedUnarchiver suffisamment d'informations pour pouvoir désarchiver plus tard.

Maintenant, regardons les données JSON:

{"Value3":"12","Value2":"10","Value1":"sadsadasdasdsadqwwqsadasd"}

Voilà. Une ligne. 66 octets. Parmi ceux-ci, 19 octets ne sont pas vos valeurs. En d'autres termes, 71% de ces données JSON sont vos valeurs, et le reste est un balisage, pour ainsi dire. Pendant ce temps, dans les données NSKeyedArchiver, vos valeurs constituent, attendez, 12% du résultat. Je pense que vous pouvez clairement voir lequel est le plus efficace pour le stockage ici.

+0

Cela prend tout son sens. Merci de m'avoir expliqué si gracieusement! – Abhinav

Questions connexes