将nsdictionary转换为nsdata

时间:2011-08-30 20:19:35

标签: iphone objective-c uiimagepickercontroller nsdictionary nsdata

有一个应用程序,可以拍照,然后上传到服务器。将其编码为base 64并将其通过XMLRPC传递给我的php服务器。

我想获取从UIImagePickerController委托

返回的NSDictionary信息
-(void) imagePickerController:(UIImagePickerController *)imagePicker didFinishPickingMediaWithInfo:(NSDictionary *)info

并将其转换为NSData,以便对其进行编码。

那么,我如何将NSDictionary转换为NSData?

5 个答案:

答案 0 :(得分: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];

答案 1 :(得分: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

答案 2 :(得分: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];

答案 3 :(得分:4)

NSDictionary - > NSData的:

    NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myDictionary];

NSData - >的NSDictionary:

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

答案 4 :(得分:3)

我发现了三个选项,其中两个在NSKeyedArchiver和PropertyList中提到了两个选项,还有NSJSONSerialization在一个简单的测试中给了我最紧凑的数据。

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 bytes
  • 已存档316字节