我可以将 NSData 对象保存为二进制文件吗?
Can I save an NSData object to a file as binary?
我正在尝试以二进制格式将数据保存到文件中,以便文件大小尽可能小。但似乎 NSPropertyListFormat.BinaryFormat_v1_0 实际上并没有创建二进制数据,而是创建了一个与 NSPropertyListFormat.XMLFormat_v1_0 完全相同的 XML 风格的格式。难道我做错了什么?这是一些测试代码:
@IBAction func archiveAction(sender: AnyObject) {
let firstName = "Robert"
let lastName = "Smith"
var md: NSMutableData = NSMutableData()
var archiver = NSKeyedArchiver(forWritingWithMutableData:md)
archiver.outputFormat = NSPropertyListFormat.BinaryFormat_v1_0
archiver.encodeObject(firstName, forKey: "first")
archiver.encodeDouble(123.456, forKey: "double")
archiver.encodeFloat(Float(M_PI), forKey: "pi")
archiver.encodeObject(lastName, forKey: "last")
archiver.finishEncoding()
let filePath = NSTemporaryDirectory().stringByAppendingPathComponent("FileNameBinary")
md.writeToFile(filePath, atomically: false)
println("done")
}
当我检查创建的文件时,我发现它是一个 XML 文件。它的字节数与我将 .BinaryFormat_v1_0 更改为 .XMLFormat_v1_0.
时的字节数完全相同
那么如何将数据保存为二进制呢?
编辑:这是文件内容:
<?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>$archiver</key>
<string>NSKeyedArchiver</string>
<key>$objects</key>
<array>
<string>$null</string>
<string>Robert</string>
<string>Smith</string>
</array>
<key>$top</key>
<dict>
<key>double</key>
<real>123.456</real>
<key>first</key>
<dict>
<key>CF$UID</key>
<integer>1</integer>
</dict>
<key>last</key>
<dict>
<key>CF$UID</key>
<integer>2</integer>
</dict>
<key>pi</key>
<real>3.1415927410125732</real>
</dict>
<key>$version</key>
<integer>100000</integer>
</dict>
</plist>
TextWrangler 可能知道如何读取 plist 文件,无论是二进制格式还是 XML 格式。要真正看到差异,您必须使用与 plist 文件类型无关的实用程序。以下所有信息均使用您发布的示例代码。
文件大小:
> ls -l FileName*
-rw-r--r-- 1 zd staff 196 14 Jul 19:10 FileNameBinary
-rw-r--r-- 1 zd staff 700 14 Jul 19:10 FileNameXML
所以二进制格式比 XML 小得多(196 对 700 字节)。
文件内容:
> cat FileNameBinary
bplist00?
X$versionX$objectsY$archiverT$top??? U$nullVRobertUSmith_NSKeyedArchiver?
VdoubleUfirstRpiTlast#@^?/??w?"@I#-27;AHN`ipvy~????
> cat FileNameXML
<?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">
(extra lines trimmed)
再次内容不同
两种格式之间存在差异。你只需要知道如何寻找它们。
我正在尝试以二进制格式将数据保存到文件中,以便文件大小尽可能小。但似乎 NSPropertyListFormat.BinaryFormat_v1_0 实际上并没有创建二进制数据,而是创建了一个与 NSPropertyListFormat.XMLFormat_v1_0 完全相同的 XML 风格的格式。难道我做错了什么?这是一些测试代码:
@IBAction func archiveAction(sender: AnyObject) {
let firstName = "Robert"
let lastName = "Smith"
var md: NSMutableData = NSMutableData()
var archiver = NSKeyedArchiver(forWritingWithMutableData:md)
archiver.outputFormat = NSPropertyListFormat.BinaryFormat_v1_0
archiver.encodeObject(firstName, forKey: "first")
archiver.encodeDouble(123.456, forKey: "double")
archiver.encodeFloat(Float(M_PI), forKey: "pi")
archiver.encodeObject(lastName, forKey: "last")
archiver.finishEncoding()
let filePath = NSTemporaryDirectory().stringByAppendingPathComponent("FileNameBinary")
md.writeToFile(filePath, atomically: false)
println("done")
}
当我检查创建的文件时,我发现它是一个 XML 文件。它的字节数与我将 .BinaryFormat_v1_0 更改为 .XMLFormat_v1_0.
时的字节数完全相同那么如何将数据保存为二进制呢?
编辑:这是文件内容:
<?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>$archiver</key>
<string>NSKeyedArchiver</string>
<key>$objects</key>
<array>
<string>$null</string>
<string>Robert</string>
<string>Smith</string>
</array>
<key>$top</key>
<dict>
<key>double</key>
<real>123.456</real>
<key>first</key>
<dict>
<key>CF$UID</key>
<integer>1</integer>
</dict>
<key>last</key>
<dict>
<key>CF$UID</key>
<integer>2</integer>
</dict>
<key>pi</key>
<real>3.1415927410125732</real>
</dict>
<key>$version</key>
<integer>100000</integer>
</dict>
</plist>
TextWrangler 可能知道如何读取 plist 文件,无论是二进制格式还是 XML 格式。要真正看到差异,您必须使用与 plist 文件类型无关的实用程序。以下所有信息均使用您发布的示例代码。
文件大小:
> ls -l FileName*
-rw-r--r-- 1 zd staff 196 14 Jul 19:10 FileNameBinary
-rw-r--r-- 1 zd staff 700 14 Jul 19:10 FileNameXML
所以二进制格式比 XML 小得多(196 对 700 字节)。
文件内容:
> cat FileNameBinary
bplist00?
X$versionX$objectsY$archiverT$top??? U$nullVRobertUSmith_NSKeyedArchiver?
VdoubleUfirstRpiTlast#@^?/??w?"@I#-27;AHN`ipvy~????
> cat FileNameXML
<?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">
(extra lines trimmed)
再次内容不同
两种格式之间存在差异。你只需要知道如何寻找它们。