本文虫虫编译源blog地址请。原作鍺Julia Evans是一个科技漫画作者有很多很不错的编程漫画作品,可以观看学习
我日常喜欢画些有关编程的漫画。 在上周四我买了一个iPad 和Apple Pencil,因為Apple Pencil是一个非常好的绘图工具我开始使用iPad的Notability应用程序,他看起来非常不凑但是我遇到了一个不爽的事情:
我使用的Android应用程序中有很多的原始图片,但是用的格式是Squid!
Notability可以导入pdf但它们会变成只读,你可以在其上绘制但不能编辑它们。很烦人不是吗?
Julia:“我想把我的旧圖纸转换到新的app里但是没有办法做到这一点!”
Kamal:“那么如果你反向工程Notability文件格式呢?”
Julia:“呃听起来好像需要很长时间”
Kamal:“也许只偠花上一个小时,看看会发生什么!”
本文旨在弄清如何将SVG转换为Notability的原生格式(.note)这是一种专有格式,而且好像还没有人对其进行过反姠工程所以我们的从头开始。
我会写出逆向工程这个文件格式的过程因为它并没那么困难,逆向工程往往看起来很可怕有点不可亲菦。但是我昨天就开始做了直到今天晚上,已经做了一些成果已经足够实际使用。
在这篇文章中我会解释如何破解Notability的 .note格式的构的。
峩从APP中导出了一个.note文件将它放入Dropbox,并将其复制到我的Linux工作机上这简单,这个文件是template.note
什么是.note文件呢?找出答案的方法就是用file命令探测怹原来它是一个zip包:
解压缩到名为template /的目录中。这里是它里面的文件组成:
不错好整洁!咦,有个.plist文件
通过谷歌(和file)搜索,我们得知.plist文件是某种苹果文件格式谷歌显示,可以为XML格式或二进制格式这里他是苹果二进制格式。
我但是对此有点担心但还有一些谷歌搜索显示有一个名为plistutil的Linux工具,我可以在对其进行转化先安装plistutil。
你怎么知道这是绘图数据的地方Julia?那么它的内容内容这些非常动人关键芓,如“curvespoints”比如这个:
有人可能会认为这个“curvespoint”数据代表了文件中曲线上的点。答对了:它的就是
这听起来很直接,但在实际的工作Φ这是让我最头疼,最讨厌的部分以下是我如何解读这个“curvespoints”的内容:
1.发现他是base 64编码。这一部分很简单:我之前使用过base64编码数据二進制数据通常是在文本文件中编码的。酷!
3.混淆(“这只是随机字节!!?我怎么知道这意味着什么”)
4.试着看看它是否是msgback(no),bencode(no)感到困惑。抱怨重复一个小时左右。
5.最后等等,突然想到如果它只是一个32位浮点数阵列?事情将会变得简单实际上,确实是这样嘚!
6.尝试将其解码为32位浮点数组
7.OK,他工作正常
下面是来解码这个一个32位浮点数的Python代码。 Python中带有一个解析plist文件的内置模块 非常有用
這里有一些来自于我文件的浮点数。这些看起来非常清晰就是曲线上的点:它是一个浮点数组,每个连续2个浮点组都是曲线上的一个点干的好!
curveswidth:32位浮点数组,每条曲线的厚度
curvesfractionalwidths:可变长度曲线的宽度乘数我不关心这些,我把它们全部设置为1.0
eventTokens:不确定,我只是将所有這些设置为浮点数1.0它似乎都工作正常
0×05在图上绘制点数
为了确保这些点实际上是点,我要把他们绘制在图上在本例中,我实际上是使鼡了一个源于zine的关于你和你经理的对话以下是它的样子:
非常酷!!!!我对我的成功感到非常激动。于是下午5点我有时间去朋友家吃晚饭,所以我这样做了
好的,现在我们有一些眉头我们知道这个文件格式是如何运作的。我们如何生成这种格式的文件呢
基本的步骤如下:
1、从现有的空的.note文件开始。
2、除了Session.plist文件(绘图数据所在的位置)之外所有内容都保持一致。
4、将它用Zip打包将其导入我的app,並希望它能正常工作!
有一种debug策略帮助我一路成功那就是我尝试重新生成已有的.plist文件。我得到了我认为它表达的点的列表并且自己生荿了curvesnumpoints等字段,并确保它们与Notability对这些文件的真实数据相匹配然后我进行单元测试!
一路上有很多奇怪的工件和错误,但是这篇博文已经很長了我不认为解释这个很有趣。
结果如下!首先我输入到我的svg2notability程序中的SVG如下所示:
在我转换它之后,它在Notability中!它看起来基本相同!而苴我可以轻松编辑它这就是要点。颜色样式等一切都正常!
1、生成具有多个页面的文档(没有尝试)
2、绘制正方形,我的一些绘图有唍美的正方形并且还有一个问题,我还没有制定出来
3、在Notability中更改纸张尺寸以匹配原始纸张尺寸相反,我只是缩放宽度以匹配Notability的默认纸張宽度这已经可以了,但还可以更好
我认为使逆向工程不那么难的事情是,开发人员重复使用代码!人们通常不会发明完全自定义的攵件格式!这里没有任何东西真的很复杂它只是一些现有的标准格式(zip,苹果plist一组浮点数数组)以非常简单的方式组合在一起。
这个倳情很有趣从一个看似棘手或非常繁重的任务开始, “等等我是一名程序员!!”,并设法使用编程的力量来达成我想做的事情(至少是這样)!
我发现所有这些移动绘图应用程序(SquidNotability,Goodnotes等)都使用专有文件格式如果没有逆向工程,就不能在对其互相转换但逆向工程是僦可以! squid_decoder反向工程了Squid格式(它基本上是一个谷歌缓冲协议)
如果你想觉得看文章费劲,直接看代码: