11

写真を撮ってからサーバーにアップロードできるアプリがあります。それをベース64にエンコードし、それをXMLRPCを通して私のPHPサーバに渡します。nsdictionaryをnsdataに変換する

iはUIImagePickerControllerデリゲート

-(void) imagePickerController:(UIImagePickerController *)imagePicker didFinishPickingMediaWithInfo:(NSDictionary *)info 

から返されたNSDictionaryの情報を取るので、私はそれをエンコードすることができたNSDataに変換します。

NSDictionaryをNSDataに変換するにはどうすればよいですか?

答えて

23

NSKeyedArchiverを使用すると、NSDictionaryをNSDataオブジェクトにシリアル化できます。ディクショナリ内のすべてのオブジェクトは、これが機能するためには、直列化可能(継承ツリーのある時点でNSCodingを実装する)する必要があります。そう、ここで、コードを持ち上げるために私のプロジェクトを通過するのが面倒

は、インターネットからいくつかある:

エンコード

NSMutableData *data = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
[archiver encodeObject:yourDictionary forKey:@"Some Key Value"]; 
[archiver finishEncoding]; 
[archiver release]; 
/** data is ready now, and you can use it **/ 
[data release]; 

デコード:

NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]]; 
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 
NSDictionary *myDictionary = [[unarchiver decodeObjectForKey:@"Some Key Value"] retain]; 
[unarchiver finishDecoding]; 
[unarchiver release]; 
[data release]; 
+0

iが試みアーカイブこれを実装していますが、エラーが発生しても 2011-08-30 15:46:18.468 Satshot [1986:307] - [UIImage encodeWithCoder:]:インスタンスに送信された認識できないセレクタ0x630de50 2011-08-30 15:46:18.502 Satshot [1986 :307] ***キャッチされていない例外 'NSInvalidArgumentException'の理由によるアプリケーションの終了 - 理由: ' - [UIImage encodeWithCoder:]認識できないセレクタがインスタンス0x630de50に送信されました' infoはnsdictionaryでなければならないUIImagePickerControllerデリゲート。私も[archiver encodeObject:info]を試して、同じエラーを取得します。 – Padin215

+0

[archiver encodeRootObject:info]にエラーが発生しました。とその "SIGABRT"エラーは、それを言及することを忘れて悲しい。 – Padin215

+2

UIImageを回避することなく、NSKeyedArchiverでシリアル化することはできません。 – Perception

4

私は遅すぎるビットを知っていますしかし、誰かがこの同じ問題にぶつかる場合に備えて。 UIImageはシリアライズはありませんが、コードを使用して、それをシリアル化することができます

あなたのイメージがJPGの場合:

NSData *imagenBinaria = [NSData dataWithData:UIImageJPEGRepresentation(imagen, 0.0)]; 

// imagen is a UIImage object 

あなたのイメージがPNGの場合:

NSData *imagenBinaria = [NSData dataWithData:UIImagePNGRepresentation(imagen)]; 

// imagen is a UIImage object 
4

NSPropertyListSerializationクラスを使用する与えますプロパティリストの書き込みと読み取りに関するほとんどの制御:

NSDictionary *dictionary = @{@"Hello" : @"World"}; 
NSData *data = [NSPropertyListSerialization dataWithPropertyList:dictionary 
              format:NSPropertyListBinaryFormat_v1_0 
              options:0 
              error:NULL]; 

読む:

NSData *data = ... 
NSPropertyListFormat *format; 
NSDictionary *dictionary = [NSPropertyListSerialization propertyListWithData:data 
                 options:0 
                 format:&format 
                 error:NULL]; 
+0

警告が出る –

+1

読み取りが正しくない... NSError * error; NSPropertyListFormat形式。 NSDictionary * dictionary = [NSPropertyListSerialization propertyListWithData:self.inputFormEncodedDictionaryオプション:0フォーマット:&フォーマットエラー:&エラー]; –

4

NSDictionaryの - >のNSData:

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary]; 

たNSData - > NSDictionaryの:

NSDictionary *myDictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:myData]; 
3

3つのオプションは、2つの述べたように、この上で私に起こります他の回答NSKeyedArchiverとPropertyListには、NSJSONSeriali私は単純なテストで最もコンパクトなデータを得ました。異なるアプローチのため

NSDictionary *dictionary = @{@"message":@"Message from a cool guy", @"flag":@1}; 
NSData *prettyJson = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:nil]; 
NSData *compactJson = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:nil]; 
NSData *plist = [NSPropertyListSerialization dataWithPropertyList:dictionary 
                  format:NSPropertyListBinaryFormat_v1_0 
                  options:0 
                  error:NULL]; 
NSData *archived = [NSKeyedArchiver archivedDataWithRootObject:dictionary];` 

サイズ結果最小compactJson

  • 最大46バイト
  • prettyJson 57バイト
  • plistの91のバイトは、
  • は316バイト
関連する問題