python - 在python中反序列化objective-c二进制NSMutableArray

标签 python objective-c sqlite serialization

我正在用 python 编写一个 Google App Engine Web 应用程序,并使用 iPhone 应用程序 (sqlite) 中的数据库为其提供种子。

我在 3 个字段上遇到了一些困难,这些字段被定义为 blob 字段,并且其中包含二进制序列化对象。 (通常它们以“bplist”开头,所以我假设它是一个二进制序列化属性列表 - 我感兴趣的列表中也包含序列化的 NSMutableArray。)

我怀疑我的两个选择是 a) 看看二进制格式如何适合正则表达式样式地抓取值(它们都是文本) b) 编写一个快速的iOS应用程序,打开数据库,将数据导出为更好的格式

任何其他想法,建议最好的路线,或者(手指交叉)指向某种伟大的 python 蛋,它解决了我所有的问题。

下面我包含了一个示例,并尝试为媒体合理地格式化它 - 从底部我需要提取的是(匿名的实际数据)

street = "1111 Address Ln #2004"
street2 = ""
City = "Dallas"
State = "Tx"
Zip = "75243"
Country = ""
Type = ""

以下是典型条目的数据: http://dl.dropbox.com/u/6649380/serializedobject.txt

"000000ACB  62 70 6C 69 73 74 30 30-D4 01 02 03 04 05 06 09   |bplist00Ô.|"
"000000ADB  0A 58 24 76 65 72 73 69-6F 6E 54 24 74 6F 70 59   |.X$versionT$topY|"
"000000AEB  24 61 72 63 68 69 76 65-72 58 24 6F 62 6A 65 63   |$archiverX$objec|"
"000000AFB  74 73 12 00 01 86 A0 D1-07 08 54 72 6F 6F 74 80   |ts † ÑTroot€|"
"000000B0B  01 5F 10 0F 4E 53 4B 65-79 65 64 41 72 63 68 69   |_NSKeyedArchi|"
"000000B1B  76 65 72 AF 10 12 0B 0C-12 25 26 27 27 28 29 2A   |ver¯%&''()*|"
"000000B2B  2B 2C 2D 2E 2F 30 34 3B-3E 55 24 6E 75 6C 6C D2   |+,-./04;>U$nullÒ|"
"000000B3B  0D 0E 0F 10 56 24 63 6C-61 73 73 5A 4E 53 2E 6F   |.V$classZNS.o|"
"000000B4B  62 6A 65 63 74 73 80 11-A1 11 80 02 D3 0D 13 0E   |bjects€¡€Ó.|"
"000000B5B  14 15 1D 57 4E 53 2E 6B-65 79 73 80 10 A7 16 17   |WNS.keysۤ|"
"000000B6B  18 19 1A 1B 1C 80 03 80-04 80 05 80 06 80 07 80   |€€€€€€|"
"000000B7B  08 80 09 A7 1E 1F 20 21-21 21 24 80 0A 80 0B 80   |€.§ !!!$€.€€|"
"000000B8B  0C 80 0D 80 0D 80 0D 80-0E 54 63 69 74 79 55 73   |€.€.€.€TcityUs|"
"000000B9B  74 61 74 65 53 7A 69 70-57 73 74 72 65 65 74 32   |tateSzipWstreet2|"
"000000BAB  54 74 79 70 65 57 63 6F-75 6E 74 72 79 57 73 74   |TtypeWcountryWst|"
"000000BBB  72 65 65 74 31 56 44 61-6C 6C 61 73 52 54 78 55   |reet1VDallasRTxU|"
"000000BCB  37 35 32 34 33 50 D2 0D-31 32 33 59 4E 53 2E 73   |75243PÒ.123YNS.s|"
"000000BDB  74 72 69 6E 67 80 0F 5F-10 14 31 31 31 31 20 41   |tring€_1111 A|"
"000000BEB  64 64 72 65 73 73 20 4C-6E 20 23 32 30 30 34 D2   |ddress Ln #2004Ò|"
"000000BFB  35 36 37 38 58 24 63 6C-61 73 73 65 73 5A 24 63   |5678X$classesZ$c|"
"000000C0B  6C 61 73 73 6E 61 6D 65-A3 38 39 3A 5F 10 0F 4E   |lassname£89:_N|"
"000000C1B  53 4D 75 74 61 62 6C 65-53 74 72 69 6E 67 58 4E   |SMutableStringXN|"
"000000C2B  53 53 74 72 69 6E 67 58-4E 53 4F 62 6A 65 63 74   |SStringXNSObject|"
"000000C3B  D2 35 36 3C 3D A2 3D 3A-5C 4E 53 44 69 63 74 69   |Ò56<=¢=:\NSDicti|"
"000000C4B  6F 6E 61 72 79 D2 35 36-3F 40 A3 40 41 3A 5E 4E   |onaryÒ56?@£@A:^N|"
"000000C5B  53 4D 75 74 61 62 6C 65-41 72 72 61 79 57 4E 53   |SMutableArrayWNS|"
"000000C6B  41 72 72 61 79 00 08 00-11 00 1A 00 1F 00 29 00   |Array     ) |"
"000000C7B  32 00 37 00 3A 00 3F 00-41 00 53 00 68 00 6E 00   |2 7 : ? A S h n |"
"000000C8B  73 00 7A 00 85 00 87 00-89 00 8B 00 92 00 9A 00   |s z … ‡ ‰ ‹ ’ š |"
"000000C9B  9C 00 A4 00 A6 00 A8 00-AA 00 AC 00 AE 00 B0 00   |œ ¤ ¦ ¨ ª ¬ ® ° |"
"000000CAB  B2 00 BA 00 BC 00 BE 00-C0 00 C2 00 C4 00 C6 00   |² º ¼ ¾ À Â Ä Æ |"
"000000CBB  C8 00 CD 00 D3 00 D7 00-DF 00 E4 00 EC 00 F4 00   |È Í Ó × ß ä ì ô |"
"000000CCB  FB 00 FE 01 04 01 05 01-0A 01 14 01 16 01 2D 01   |û þ.-|"
"000000CDB  32 01 3B 01 46 01 4A 01-5C 01 65 01 6E 01 73 01   |2;FJ\ens|"
"000000CEB  76 01 83 01 88 01 8C 01-9B 00 00 00 00 00 00 02   |vƒˆŒ›      |"
"000000CFB  01 00 00 00 00 00 00 00-42 00 00 00 00 00 00 00   |       B       |"
"000000D0B  00 00 00 00 00 00 00 01-A3                        |       £       |"

最佳答案

如果您计划在 Mac 上运行此脚本,则可以使用 plutil 命令将其转换为更易于解析的 XML 格式:

plutil -convert xml1 -o outfile infile

要将输出发送到 stdout,请使用 - 作为输出文件。如果省略 -o 选项,输出将覆盖输入文件。如果您愿意,可以使用 json 格式而不是 xml1 来获取 JSON 格式的输出。

关于python - 在python中反序列化objective-c二进制NSMutableArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7707292/

相关文章:

objective-c - 更改 NSTextView 中空格字符的宽度

iphone - 如何使 View 像揉皱的纸一样动画

ios - UILabel 中的可点击用户名和主题标签(不是 UIWebView!)

sql - 如何计算每组的百分比?

android - 零星的 NullPointerException 尽管对象不为空

python - 基于多种条件在pandas dataframe中进行聚合和转换

python - bool 索引将列值存储为 python 中的变量

python - 将 Kivy 应用程序连接到 Django 数据库

python - 始终返回数组的 numpy 切片

python - 在类中使用导入