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

标签 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> 的值是错的。它应该与我为签名 key 传递的值相同。这是生成的(错误的).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 时,签名数据的值会发生变化?

最佳答案

值是相同的。只是表示形式不同,就像 1010.0000x0A 是同一值的不同表示形式一样。 XML 属性列表使用 Base64 编码存储值,而 -[NSData description] (由 NSLog() 打印)使用 Base 16(也称为十六进制)编码生成。您正在寻找一种方法 Base64-encode an NSData object .

关于xcode - 为什么 NSDictionary 在读取/写入 .plist 时会更改 <data> 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11145215/

相关文章:

ios - 如何在 iOS 8 swift 中更改按钮文本大小

macos - 如何在 iCloud 中同步核心数据?(OS X Lion 应用程序)

ios - 从 PubNub 消息中检索内容

ios - Xcode 使用了错误的本地化

swift - XCodeBuild -exportArchive 不允许我指定文件名

xcode - 解析和 Swift Xcode 6.3 问题

objective-c - 无法在 iOS 后台模式下重新启动中断的音频输入队列

macos - 为什么 `NSAppKitVersionNumber10_10` 不包含在 OS X 10.10 Yosemite 的 `NSApplication.h` 中?

ios - 从带有数据的照片库中打开 UIImage

ios - 在 Swift 3.0 中访问嵌套的 NSDictionary 值