为什么NSDictionary在读取/写入.plist </data>时会更改<data>的值

时间:2012-06-21 19:17:13

标签: xcode cocoa nsdictionary nstextfield

我遇到一个问题,当我从磁盘读取文件时,NSDictionary正在更改<data>标记内的值。当我将其保存回磁盘时,它也会更改它。

我在磁盘上有一个我读入字典的.plist文件。这是原始plist文件的内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Email</key>
    <string>user@email.com</string>
    <key>Name</key>
    <string>User</string>
    <key>Signature</key>
    <data>
    RBMIIr2dotiiKH5p6oTGsjqR7FSsmafZHpmJ7coO56eY8d5mBiVSZI5LCe7I3vGJk7WX
    0W/dLyAS+Es5fPlDhhSLNzesR1lNzMaTdfEKGU1FkvLE8bsZFJ7pK5gFc62e1NfP2eyU
    59SwWZDiqXumhUIOebhdZk5amtY7mN/McYM=
    </data>
</dict>
</plist>

我需要<data>的值,所以我可以在NSTextField中显示它,所以我得到这样的值:

NSData *key = [[NSDictionary dictionaryWithContentsOfFile:fileURLString] objectForKey:@"Signature"];

现在,当我尝试使用NSLog(@"key: %@", key);显示密钥的值时,它会向我显示:

<44130822 bd9da2d8 a2287e69 ea84c6b2 3a91ec54 ac99a7d9 1e9989ed ca0ee7a7 98f1de66 06255264 8e4b09ee c8def189 93b597d1 6fdd2f20 12f84b39 7cf94386 148b3737 ac47594d ccc69375 f10a194d 4592f2c4 f1bb1914 9ee92b98 0573ad9e d4d7cfd9 ec94e7d4 b05990e2 a97ba685 420e79b8 5d664e5a 9ad63b98 dfcc7183>

那么,如何将原始<data>作为NSString以与.plist中显示的格式相同的方式获取?以及这种(错误的)格式是什么直接在上面叫做?

注意:我已设法通过使用<data>提取文本来获取/存储原始componentsSeparatedByString值,但这似乎是一个糟糕的黑客。

现在我需要将.plist文件保存回磁盘,以便它与原始.plist文件匹配,但这也不起作用。这就是我在做的事情:

NSString *sig = @"RBMIIr2dotiiKH5p6oTGsjqR7FSsmafZHpmJ7coO56eY8d5mBiVSZI5LCe7I3vGJk7WX0W/dLyAS+Es5fPlDhhSLNzesR1lNzMaTdfEKGU1FkvLE8bsZFJ7pK5gFc62e1NfP2eyU59SwWZDiqXumhUIOebhdZk5amtY7mN/McYM=";
const char *cString = [sig cStringUsingEncoding:NSASCIIStringEncoding];
NSData *d = [NSData dataWithBytes:cString length:strlen(cString)];
NSMutableDictionary *nameDetails=[[NSMutableDictionary alloc] init]; 
[nameDetails setValue:email forKey:@"Email"]; 
[nameDetails setValue:name forKey:@"Name"]; 
[nameDetails setValue:d forKey:@"Signature"]; 

...

[nameDetails writeToFile:fileURLString atomically:YES];

当我查看新的.plist文件时,<data>的值是错误的。它应该与我为Signature键传递的值相同。这是生成的(坏).plist文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Email</key>
    <string>user@email.com</string>
    <key>Name</key>
    <string>User</string>
    <key>Signature</key>
    <data>
    UkJNSUlyMmRvdGlpS0g1cDZvVEdzanFSN0ZTc21hZlpIcG1KN2NvTzU2ZVk4ZDVtQmlW
    U1pJNUxDZTdJM3ZHSms3V1gwVy9kTHlBUytFczVmUGxEaGhTTE56ZXNSMWxOek1hVGRm
    RUtHVTFGa3ZMRThic1pGSjdwSzVnRmM2MmUxTmZQMmV5VTU5U3dXWkRpcVh1bWhVSU9l
    YmhkWms1YW10WTdtTi9NY1lNPQ==
    </data>
</dict>
</plist>

那么,为什么签名数据的价值会在我将其保存回.plist后发生变化?

1 个答案:

答案 0 :(得分:1)

价值是一样的。它只是表示不同,就像1010.0000x0A是同一值的不同表示一样。 XML属性列表使用Base64编码存储值,而-[NSData description](由NSLog()打印)使用基数16(a.k.a。十六进制)编码。您正在寻找Base64-encode an NSData object的方式。