有一个应用程序,可以拍照,然后上传到服务器。将其编码为base 64并将其通过XMLRPC传递给我的php服务器。
我想获取从UIImagePickerController委托
返回的NSDictionary信息-(void) imagePickerController:(UIImagePickerController *)imagePicker didFinishPickingMediaWithInfo:(NSDictionary *)info
并将其转换为NSData,以便对其进行编码。
那么,我如何将NSDictionary转换为NSData?
答案 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];`
从最小到最大的不同方法的大小结果