本文要讲述是第二次解析--解析彩信正文,先贴张图见识下我们要解析的东东是个什么样子,见下图,初次见面和看天书差不了多少。
这个就是我们要面对的数据了,至于怎么拿到这些数据,方法很多,话说不是可以抓网络数据包吗,把完整的网络包拿下来,那里肯定有的。当然如果有相关的源码,抓这些数据更容易了,自已动手试试吧。试之前先一起看看上面这个图吧。
000h:8C84 X-Mms-Message-Type 编码为 8C,表示彩信, 84 表示是收到的 如果是发出的是80
接下来是 98 tansatcionId 唯一标识该彩信,很长的一串数字,直到你看到8D,
8D表示彩信版本 8D后面的90表示彩信版本1.0
85后面是彩信日期 :距19700101的时间 ,
89表示彩信是从哪个号码来的,如果后面还有96 那表示彩信有主题,如果没有则表示无主题,上面这个彩信是有主题的
主题之后 8A80 msg class:PERSONAL
8F81彩信优先级:中,一般
8680彩信是否有递送报告:80表示有,81没有
到这里关于彩信的一些基本信息就算解完了,关于彩信的时间、发件人、是否需要报告、主题这些信息都有了。那后面的信息是什么呢,其实通常的彩信文件没有这么短的,只是贴图上的彩信文件是仅包含主题的彩信,如果是包含图片、音频或视频的彩信,就没有这么短了,所以在彩信的基本信息之后就是关于彩信图片或音视频之类的文件信息的描述了,会说明有几个彩信附件以及附件所对应内容。这一部分一般是先会有一个字节说明接下来文件的长度,然后接上文件的真实内容,这个内容就是用UE之类的编辑器以十六进制查看文件所能看到的东东,换句话说如果你把这部分内容完整的复制出来,再配合正确的扩展名,就可以得到一个图片或音频等文件。
最后关于彩信中内容的解析还要关注几个字段,在android源码里PduPart.java里有几个字段是对解析彩信内容起关键作用的,看下代码,
public static final int P_CONTENT_TYPE = 0x91;
public static final int P_CONTENT_LOCATION = 0x8E;
public static final int P_CONTENT_ID = 0xC0;
public static final int P_NAME = 0x97;
public static final int P_FILENAME = 0x98;
上面这几个应该说一个标准的彩信里应该都应该有,这是出于程序健壮性的考虑,也许有时候解彩信的程序员就检查了一个字段比如content-location或filename,如果没有写这个字段,那彩信就无法识别了。反过来说,如果我们是解彩信的程序员,也要检查上述所有的字段,我们是无法保证别人一定按套路出牌的。在android的mms源码里下面的代码也是要关注的,这里应该算android源码健壮性不足的地方中一个吧。这个代码在MediaModelFactory.java里,是关于彩信显示的。
private static PduPart findPart(PduBody pb, String src) {
PduPart part = null;
if (src != null) {
src = unescapeXML(src);
if (src.startsWith("cid:")) {
part = pb.getPartByContentId("");
} else {
part = pb.getPartByName(src);
if (part == null) {
part = pb.getPartByFileName(src);
if (part == null) {
part = pb.getPartByContentLocation(src);
}
}
}
}
if (part != null) {
return part;
}
throw new IllegalArgumentException("No part found for the model.");
}
关于彩信为什么这么解析,为什么有这些字段,是要看OMA相关文档的,其实彩信就是一个邮件,不但有主题和附件,而且还有抄送,只不抄送android源码没有体现出来的。暂且先写到这里了,如果有感兴趣的兄弟,欢迎沟通。