对于数据恢复程序,我需要能够从NSArchiver编写的文件中提取值类型,而无需访问Apple的CF / NS框架.

OS X file命令报告以下文件:

NeXT/Apple typedstream data,little endian,version 4,system 1000

是否有关于如何编码这些文件的文档,或者是否有人提出可以解析它们的代码?

以下是此类数据的示例(也是:downloadable):

04 0B 73 74 72 65 61 6D 74 79 70 65 64 81 E8 03  ..streamtyped...
84 01 40 84 84 84 12 4E 53 41 74 74 72 69 62 75  ..@....NSAttribu
74 65 64 53 74 72 69 6E 67 00 84 84 08 4E 53 4F  tedString....NSO
62 6A 65 63 74 00 85 92 84 84 84 08 4E 53 53 74  bject.......Nsst
72 69 6E 67 01 94 84 01 2B 06 46 65 73 6B 65 72  ring....+.Fesker
86 84 02 69 49 01 06 92 84 84 84 0C 4E 53 44 69  ...iI.......NSDi
63 74 69 6F 6E 61 72 79 00 94 84 01 69 01 92 84  ctionary....i...
96 96 1D 5F 5F 6B 49 4D 4D 65 73 73 61 67 65 50  ...__kIMMessageP
61 72 74 41 74 74 72 69 62 75 74 65 4E 61 6D 65  artAttributeName
86 92 84 84 84 08 4E 53 4E 75 6D 62 65 72 00 84  ......NSNumber..
84 07 4E 53 56 61 6C 75 65 00 94 84 01 2A 84 99  ..NSValue....*..
99 00 86 86 86                                   .....

这包含NSAttributedString.我有类似的例子,包含NSMutableAttributedStrings等,但最终都解析为NSAttributedStrings,我喜欢获取文本.我不关心其余的,但我需要知道它是否有效.

我目前的解决方案是使用NSUnarchiver,假设我总是应该在那里找到NSAttributedString,获取它的第一个元素并读取它的文本,然后从中重新创建一个存档,看它是否与原始数据相同.如果我收到异常或其他存档,我认为存档已损坏或无效:

NSData *data = [[NSData alloc] initWithBytesNocopy:dataPtr length:dataLen freeWhenDone:false];
NSUnarchiver *a = NULL;

// The algorithm simply assumes that the data contains a NSAttributedString,retrieves it,// and then recreates the NSArchived version from it in order to tell its size.
@try {
    a = [[NSUnarchiver alloc] initForReadingWithData:data];
    NSAttributedString *s = [a decodeObject];

    // re-encode the string item so we can tell its length
    NSData *d = [NSArchiver archivedDataWithRootObject:s];
    if ([d isEqualTo:[data subdataWithRange:NSMakeRange(0,d.length)]]) {
        lenOut = (int) d.length;
        okay = true; // -> lenOut is valid,though textout might still fail,see @catch below
        textout = [s.string cStringUsingEncoding:NSUTF8StringEncoding];
    } else {
        // oops,we don't get back what we had as input,so let's better not consider this valid
    }
} @catch (NSException *e) {
    // data is invalid
}

但是,上面的代码有几个问题:

>这不是x平台.我也需要这个在Windows上工作.
>某些损坏数据的示例会导致写入stderr或syslog的不需要的错误消息(不确定是哪个),例如:*** mmap(size = 18446744071608111104)失败(错误代码= 12)***错误:无法分配region ***在malloc_error_break中设置一个断点来调试(我提交了一个关于这个的错误报告,因为“不会修复”而遗憾).
>没有什么能保证NSUnarchiver代码100%防崩溃. malloc错误就是一个例子.在某些情况下,我可能会遇到总线错误,这将是致命的.如果我有自定义代码进行解析,我可以自己处理(并修复我遇到的任何崩溃). (更新:我刚发现一些无效数据确实使NSUnarchiver与SIGSEGV崩溃.)

因此,我需要自定义代码来解码这些类型的档案.我看了几个,但无法理解它使用的代码.显然,有长度字段和类型字段,显然类型在0x81到0x86范围内.此外,前16个字节是标题,包括偏移14-15的系统代码(0x03E8 = 1000).

我也想知道源代码是否在某些旧的NeXT源或曾经存在的Windows版本中可用,但我会在哪里找到它? (注意:我被引导到GNUstep源代码(“core.20131003.tar.bz2”),我在其中找到了它的NSUnarchiver源代码,但该代码显然是从1998年开始使用它自己的编码,但这并不理解这个“ streamtyped“编码.”

解决方法

虽然我不知道格式的任何文档,但您可以通过查看较旧的Darwin(或OpenStep)版本的公共源代码来查找您要查找的信息.

例如,在this mirror of an old darwin distribution可用的objc-1.tar.gz文件中查看typedstream.m文件中typedstream的实现.

这个源代码应该能够读/写typedstream.请务必在使用时确认Apple的许可证.

ios – 检查“NeXT / Apple typedstream”版本4(NSArchiver)类型的文件的更多相关文章

  1. ios – 在AFNetworking中设置用户代理

    我们的iOS应用程序最近被Apple拒绝,因为它无法与我们的服务器api建立有效连接.我们使用特殊格式的用户代理来注册设备令牌等.如果用户代理不适合我们的sheme,则api会阻止请求.这一切都很好地在模拟器和真实设备上测试应用程序.用户代理设置正确,api调用工作正常.当Apple测试应用程序时,他们拒绝了它,因为应用程序无法连接到api.当我们检查服务器日志文件时,我们注意到,Apple测试人

  2. ios – 将iphone应用程序重定向到苹果商店

    我有一个iPhone应用程序,当有可用的升级时,我想提示用户升级,如果他们点击升级,我想将它们重定向到苹果商店.这是怎么做到的?

  3. ios – 如何从Apple Watch调用iPhone上定义的方法

    有没有办法从Watchkit扩展中调用iPhone上的类中定义的方法?根据我的理解,目前在Watchkit和iPhone之间进行本地通信的方法之一是使用NSUserDefaults,但还有其他方法吗?

  4. ios – Ad-hoc应用程序始终无法安装

    所以我在使用ios5的ipad1上安装ad-hoc分发应用程序时遇到问题.我在其他ipads中安装时没有这个问题…

  5. Xcode 4.5:没有iphoneos的“com.apple.product-type.application”产品类型

    我刚刚将Xcode升级到4.5版,但是我现在在尝试在iPhone上运行时遇到此错误:它在模拟器上工作正常,它曾用于4.4版本.解决方法您可能从XCode规范中丢失了应用程序部分退出XCode并转到(对于MacAppStore中的Xcode):/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Develope

  6. ios – 从Apple应用商店暂时删除应用

    我想暂时从Apple应用商店删除应用.在定价和可用性的iConnect仪表板中,有一个选项“从销售中删除”.这会完全删除应用程序吗?我想在几周内取消发布,然后将其退回.如果是这样的话,当我将它退还给可供出售时,是否会再次进行审核?.解决方法在iTunesConnect中>定价和供货部分,您可以轻松切换>适用于所有地区>从销售中删除选择正确的一个后,您只需点击“保存”按钮即可.它不会被删除或立即添加,在AppStore中更改状态需要一些时间.

  7. ios – Apple Watch,WatchKit Extension和主要应用程序

    有逻辑的主要应用程序,我们将应用程序扩展到AppleWatch.添加目标xCode后,再创建2个应用程序:扩展代码和监视工具包应用程序.问题:扩展程序中的代码如何重用已准备好的主要iOS应用程序的逻辑?

  8. ios – 应用内购买沙盒 – Apple登录的持续提示?

    解决方法我遇到了这个问题.我意识到我没有调用finishTransaction.

  9. 由于没有IAP的用户购买订阅,iOS应用被拒绝

    我在iOS平台上构建了一个工具应用程序.我想为用户创建三个级别.基本,专业和高级.每个级别提供不同的功能.因此,用户需要支付专业和高级订阅计划.级别之间的区别是用户可以创建比基本用户更多的文档.问题是我不想使用IAP,我不希望苹果分享30%的收入,所以我创建了一个网站让用户通过网络支付订阅.我之前已经批准了3次应用程序,没有任何拒绝.但最近,Apple评论团队拒绝了我的应用程序并提供了以下信息Fr

  10. ios – 在桌面浏览器上测试Apple Smart App Banner

    我知道仅仅在桌面浏览器中欺骗用户代理在显示智能应用横幅方面没有做任何事情,但也许我可以在桌面Safari浏览器中做其他事情来测试横幅?我不是iOS开发人员,但如果有帮助的话,我可以在同事的Mac上访问iOS模拟器.解决方法不幸的是,智能应用横幅仅在真实设备上的iOSSafari上显示.iOSSimulator和桌面Safari无法显示智能应用横幅.这是一个无赖,特别是因为在他们被解雇后重置智能应用程序横幅是hugepain.

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部