Android彩信解码函数,需要从输入流中解析字段。
今天又看了一下pduparse中几个解析函数,在这里做个总结。
大概可以分为3类
一、解析字节
1.extractByteValue
这个啥也没的说,就是把一个byte转换成一个整型返回。
二、解析整型
1.parseShortInteger
基本同时,只是返回的有效位不一样,取这个byte的前7位,因此范围0-127
就 return temp & 0x7F ; 这句不一样。
2.parseUnsignedInt
解析一个无符号整型。
首先判断第一个数字最高位,如果是0,取这个字节的低7位返回。
如果是1,就继续读下一位,直到读到高位为0的byte为止,最后把各个byte的低7位串成一个整型返回。
相当于每一个byte只有7为有效。
由于一个int最多32为,所以用这种方式表示的字节流不会超过5(32/7)个octec(8位字节).
3、 parseLongInteger
这个解析一个长整型
先读取一个count,表示该整型由多少octet组成,然后读响应字节,组成一个长整型。
由于长整型最多8个字节,所以这个count不会大于8.
再者,由于有了长度,它不需要用高位来标示结束符,因此每一个字节8位都有效。
4.parseIntegerValue
解析整型。
先读取第一个字节,如果大于SHORT_INTEGER_MAX(127),即高位为1,则认为是一个short int,直接返回低7位。
否则就解析长int,先读取长度,再解析该长度的自己组成一个整型。
5.parseValueLength
读取第一个的8位字节,如果小于SHORT_LENGTH_MAX(30),返回。
如果等于LENGTH_QUOTE(31),按照parseUnsignedInt方法解析。
三、解析字符串
1.parseWapString
首先解析第一个字节,如果字符串类型是TYPE_QUOTED_STRING,并且解析出来的第一个字节标识也是QUOTED_STRING_FLAG(34),就跳过这个标示,准备读下面数据。
如果出入类型是TYPE_TEXT_STRING,并且解析出来的第一个字节也是QUOTE(127),同样也是跳过这个标识,准备读下面数据。
否则,就是没有类型标示的字符串,那么就回退数据流。按照一个字符串来解析getWapString。
2.getWapString
这个没什么好说的,就是读取字节到结束,或者 /0结束为止。
3.parseEncodedStringValue
首先读取第一个字节。
如果小于TEXT_MIN,就是说明这个字节是一个标示符,下面有编码方式。跳过这个字节,读取编码方式,然后调用parseWapString再解析下面的字符串数据。
否则,就是说明这个字符串没有编码方式,单纯一个字符串。就从头将其作为一个字符串解析。
补充,至于这些关键字符SHORT_LENGTH_MAX、LENGTH_QUOTE之类的,是wsp协议规定的,见wap-230-wsp-20010705-a.pdf,在我上传至资源中。