几个月前,我制作了一款基于Apple GLPaint的应用程序。 它很棒。
我已经记录了在屏幕上绘制简单绘图的点集。并将它们保存为点数组(转换为NSValue)。
我正在尝试改进我的应用程序,我再次看着苹果的例子。 他们的数据文件中的数据看起来像那样(我已经改变了一点):
<data>
AAC8QgAAsEMAAMJCAICoQwAAwkIBBAKRDAADCQgCAnUMAAMJCAACYQwAAwEIAgJRDAADA
QgCAkkMAAMBCAACRQwAAwEIAgJBDAADAQgCAkEM=
</data>
<data>
AACoQgAAnEMAALpCAACdQwAAxEIAAJ1DAAGGGgAAnUMAANpCAICdQwAA4kIAgJ5DAADs
QgCAn0MAAOxCAICfQw==
</data>
因此,每个组都是一个绘图,这比CGPoints的plist紧凑。
我已经成功将CGPoints数组转换为数据并重新读取文件。
BUT 当我尝试打开每个形状数据文件时,我得到了这个(在textMate,textEdit,xCode ......上):
我希望了解:
答案 0 :(得分:3)
该sample application中Apple的Recording.data
文件中的数据是包含一堆NSData对象的NSArray的XML Plist表示,每个NSData对象包含表示CGPoint结构数组的字节。请注意,这取决于CGFloat的二进制表示和CGPoint结构的特定布局,这可能在编译器或同一编译器的版本之间有所不同。
您的屏幕截图似乎是NSKeyedArchiver的输出,它更安全,但开销更大。
如果你想要一个紧凑但仍然可移植的表示,你可以手动将单个CGFloats序列化为一个可移植格式的字节数组(this previous question可以帮助你),然后将字节数组包装在NSData中,放入NSDatas进入NSArray,并使用writeToFile:atomically:
将混乱输出到像Apple那样的plist。
答案 1 :(得分:1)
请注意,数据字节在
<data>
和</data>
标记之间进行了base-64编码。
<data>
适用于NSData
,您可以使用+[NSKeyedArchiver archivedDataWithRootObject:]
从数组中获取。{/ p>