本人通过对M55通讯录的文件格式做详细的“解剖”,彻底分析出了通讯录的内部格式构成,这样我们就可以对通讯录进行优化了,比如减肥、拼音查询优化等等,这些都是用官方软件所无法办到的。
本文可以供西门子的爱好者参考,当然对懂得软件编程的开发人员来说,我想应该是目前国内首次公开的关于M55宝贵的技术资料了,不知西门子会不会找我算账……,^_^
本文是针对M55通讯录做的研究,但同样适合于西门子55系列的其他手机,如S57/SL55。
一、综述
M55的通讯录是由三个文件组成的,放在动态内存的Address book目录下,这个目录是隐藏的,所以通过手机的文件管理器是看不到的,但通过数据线借助电脑,用DES软件可以清楚的看到这个隐藏目录以及这个目录里的四个文件,也是隐藏的。
这个四个文件为别为5f08.adr, 7f08.adr, 9f08.adr和.lock文件,有别于45系列(6618/3618/6688)通讯录的5f02.adr, 7f02.adr, 9f02.adr,因为55系列(s57/sl55/m55)手机的通讯录作了许多改进和升级。
其中5f08.adr是用来存放每一条通讯录的具体内容的,按条逐次存放。我称之为记录文件。
7f08.adr里存放的是每一条通讯录在5f08.adr文件中的地址,便于检索。我称之为索引文件。
9f08.adr是由手机动态生成的,事实上备份通讯录只要拷贝前两个文件就可以了。
.lock文件固定为0字节,对于我们研究和改进通讯录没有什么关系,不用管它。
二、M55通讯薄记录文件格式(5f08.adr)
5f08.adr由文件头和其后的通讯录记录构成:
(一)、文件头: 68字节;
2字节:代表记录头中包含字段的数目,一般为29个字段,即总为1D 00;
2字节:代表记录(电话)条目个数,比如若通讯录中有18条记录,则位12 00;
剩余64字节总是:
00 00 00 00 01 00 13 01 93 01 13 01 93 02 13 01
13 01 13 08 93 00 9A 01 9A 01 0A 02 4A 00 A9 00
A9 00 A9 00 A9 00 A9 00 08 00 08 00 08 00 08 00
08 00 82 00 14 00 24 00 35 00 08 00 08 00 3A 00
(二)、记录:
每一条记录都是由以下30个字段构成,其中的记录头记录剩余29个字段的长度。
0.记 录 头:58字节,表示每条记录各字段占空间的字节长度,用2个字节表示,依次为:
姓、名、公司、街道、城市、国家、来电图片、备用(包括群组,名称前6字)、电子邮件、电子邮件2、网址、邮政编码、私人电话、公司电话、移动电话、传真、传真 2、五个电话存在标志、修改时间、内部识别号、生日重要记事地址、生日、备忘提示标志、语音拨号标记、检索拼音等29项。共占用58个字节;
1.姓 :在中国固定为2字节,没有使用这个字段,总为00 00。
2.名 字 :长度按实际字数计,最长50字节,UNICODE16码(即不论是汉字还是英文,每个字都占两个字节),最长为24个字,结束符为00 00。
3.公司名称 :长度按实际字数计,最长34字节,UNICODE16码,最长为16个汉字,结束符为00 00。
4.街 道 :长度按实际字数计,最长82字节,UNICODE16码,最长为40个汉字,结束符为00 00。
5.城 市 :长度按实际字数计,最长34字节,UNICODE16码,最长为16个汉字,结束符为00 00。
6.国 家 :长度按实际字数计,最长34字节,UNICODE16码,最长为16个汉字,结束符为00 00。
7.来电图片 :存放来电图片在动态内存中的路径,如A:\Pictures\Me.JPG,长度按实际字数计,长度几乎没有限制,UNICODE16码,结束符为00 00。
8.备 用 :固定18字节,由群组类型和重复信息组成。
其中群组类型占头2字节,30为名片、31为家人、32为朋友、33为同事、34为VIP、35为休闲玩伴、36为秘密好友、37为生意伙伴、38为物件接收、39为未设定群组,结束符为00。
然后是重复信息16字节,最多重复名字中的6个汉字,名字不足6个字的用00补足,最后4个字节总为00 00 00 00。
9.电子邮件 :长度按实际字数计,最长51字节,ASCII码,最长50个字符,结束符为00,无该项时长度为1即只含结束符。
10.电子邮件2:长度按实际字数计,最长51字节,ASCII码,最长50个字符,结束符为00,无该项时长度为1即只含结束符。
11.网 址 :长度按实际字数计,最长65字节,ASCII码,最长64个字符,结束符为00,无该项时长度为1即只含结束符。
12.邮政编码 :长度按实际字数计,最长9字节,ASCII码,最长8个字符,结束符为00,无该项时长度为1即只含结束符。
13.私人电话 :长度按实际电话位数计,最长21字节,BCD码(即一个字节可以记录两位号码),号码最长40位,奇数位电话以十六进制数F结束,偶数为FF。
如若电话为01012345678,则记为10 10 32 54 76 F8,如电话为0291234567,则记为20 19 32 54 76 FF。
14.公司电话 :长度按实际电话位数计,最长21字节,BCD码,号码最长40位,奇数位电话以十六进制数F结束,偶数为FF。
15.移动电话 :长度按实际电话位数计,最长21字节,BCD码,号码最长40位,奇数位电话以十六进制数F结束,偶数为FF。
16.传 真 :长度按实际电话位数计,最长21字节,BCD码,号码最长40位,奇数位电话以十六进制数F结束,偶数为FF。
17.传 真2:长度按实际电话位数计,最长21字节,BCD码,号码最长40位,奇数位电话以十六进制数F结束,偶数为FF。
18.私电标志 :固定1字节,FF为没有私人电话,81为有。
19.公电标志 :固定1字节,FF为没有公司电话,81为有。
20.移电标志 :固定1字节,FF为没有移动电话,81为有。
21.传真标志 :固定1字节,FF为没有传真,81为有。
22.传真2标志:固定1字节,FF为没有传真2,81为有。
23.修改时间 :固定16字节,ASCII码,格式为年月日8字节+'T'+时分秒6字节,结束符为00;如20030801T195803,代表该记录是在2003/08/01的19:58:03做的最后修改。
24.内部标识 :固定2字节,二进制码,每条通讯录都不一样。
25.重要记事地址:固定4字节,二进制码,当创建了生日提醒时,则记录重要记事的入口地址,没有生日提醒则为00 00 00 00。
26.生 日 :固定6字节,正整数表示,日(2字节)月(2字节)年(2字节);如生日为1976/11/01,则记录为01 00 0B 00 B8 07。
27.备忘提示 :固定1字节,01表示生日备忘提示打开,00表示关闭。
28.语音拨号标记:固定1字节,二进制第1位代表私电是否有语音拨号,为1代表有,0代表没有;依次第2位代表公电,第3位代表移动电话,第4位代表传真,第5位代表传真2;如该条目的私电和移动电话有语音拨号记录,则该字段为05;
29.检索拼音 :最长7字节,ASCII码,取姓名第一个字的拼音,最长长度为6,结束符为00;没有则为1个字节00;如若名字为张三,则这里存放zhang的ASCII码,为7A 68 61 6E 67 00 00。
若不计来电图片路径,总长最长为635个字节内,若考虑来电图片路径则每条记录的总长不应该超过1024个字节。
三、M55通讯录索引文件格式(7f08.adr)
7f08.adr由每条通讯录记录的索引构成,无其它内容。
索引:固定4字节,记录通讯录条目在5f08.adr中的偏移地址,每一个条目的格式为ww xx yy zz。
代表该条目在5f08.adr记录文件中的偏移地址为zzyyxxww。最高位有特殊作用,即当最高位为1时表示该记录已经删除。
四、越来越胖的通讯录
当对手机的通讯录进行删除时,手机只是简单的把7f08.adr中该条目的最高为置为1,然后把5f08.adr对应地址空间全写为DD,头一字节写为EE,表示此空间无效。
当对手机的通讯录进行编辑时,如果存储新编辑的条目需要的空间大于原来的空间时,手机是先把原记录删除(操作同上),然后在5f08.adr最后创建新的记录。
如果以后添加新的条目则曾经被标记为DD的空间也不会在被利用了,只会在5f08.adr最后继续添加新条目,这个限制是由Flash这种特殊的存储介质限定的。
因此,如果你对你的通讯录反复修改的话,5f08.adr文件内部会出现许多不能被再利用的空间(内部碎片),文件就会变的越来越“胖”。
五、笨拙的拼音检索
M55的通讯录如果按拼音排序的话,可以通过输入拼音字母来检索通讯录条目,这个设计很好,但西门子的软件人员没有把它做的更好,检索拼音只用了人名的第一个字“姓”的拼音来做检索,这样同姓的就会有大量的重复。如果能按人名的每个字的第一个拼音字母检索就好了。
六、软件预告
关于通讯录“减肥”的和拼音检索优化的软件我已经编的差不多了,在我的手机上已经实现了,如要查找刘海涛,只需输入lht,就可直接定位,我的通讯录有150来条,这种拼音检索几乎没有重复的,效率很高!
但还有一些东西要优化,估计最后的版本会在一个星期内就推出的。届时我还会写一个专题来讨论,并无偿给蝎友们提供这个软件的使用权。欢迎大家使用并评测!敬请期待……