短信猫软件的实现(C#)<五>PDU格式解码C#实现(转)
2011-09-23 16:15
489 查看
昨天简单完成了解码部分,今天加入编码部分(同一个类中)。方式和编码部分类似,利用属性对字段访问的特点,把解码程序写在属性访问部分。解码的函数只需读取这些属性值即可完成PDU解码工作。
手机或短信猫接收到的PDU字符串包含SCA、PDU-Type、OA、PID、DCS、SCTS、UDL、UD八个部分,每个部分包含对应字段和属性,字段中存储PDU格式编码对应段的字符串(函数先把对应字符串存入对应字段),属性读取过程写入代码,读取的值即为解码后的数据(短信内容、手机号码等)。
从PDU获取信息需读出(解码)四部分:SCA、OA、SCTS、UD,以下分别对其讲解。
有关收到信息PDU格式解析参考:
示例PDU串:从15050850677收到一条短信,内容“你好”。
0891683110402505F0240BA15150800576F7000801112081600423044F60597D
SCA(短消息服务中心)部分解码:
字段:serviceCenterAddress;属性:ServiceCenterAddress。
解码时,先把SCA部分PDU串(0891683110402505F0)写入字段serviceCenterAddress。属性访问器get部分完成解码工作。get部分代码:
get
{
intlen=Convert.ToInt32(serviceCenterAddress.Substring(0,2));//获取SCA长度
stringresult=serviceCenterAddress.Substring(4,len-4);//去掉起头部分
//ParityChange函数见上一篇的编码
result=ParityChange(result);//奇偶互换
result=result.TrimEnd('F','f');//去掉结尾F
returnresult;
}
这样,读取ServiceCenterAddress属性即可得到短消息中心地址。程序可读取示例消息中心:8613010452500
OA(发送方地址)部分解码:
字段:originatorAddress;属性:OriginatorAddress。
解码时,先把OA部分PDU串(0BA15150800576F7)写入字段originatorAddress。同样,从属性读取到的即为发送方的手机号码。
对应get访问器代码:
get
{
intlen=Convert.ToInt32(originatorAddress.Substring(0,2),16);//十六进制字符串转为整形数据
stringresult=string.Empty;
if(len%2==1)//号码长度是奇数,长度加1编码时加了F
{
len++;
}
result=originatorAddress.Substring(4,len);//去掉头部
result=ParityChange(result).TrimEnd('F','f');//奇偶互换,并去掉结尾F
returnresult;
}
这样,读取OriginatorAddress属性即可得到短消息中心地址。程序可读取示例消息中心:15050850677
SCTS(服务中心时间戳)部分解码:
字段:serviceCenterTimeStamp;属性:ServiceCenterTimeStamp。
解码时,先把SCTS部分PDU串(01112081600423)写入字段serviceCenterTimeStamp。同样,从属性读取到的即为消息中心收到信息的时间。
对应get访问器代码:
get
{
stringresult=ParityChange(serviceCenterTimeStamp);//奇偶互换
result="20"+result.Substring(0,12);//年加开始的“20”
returnresult;
}
读取ServiceCenterTimeStamp属性即可得到时间字符串:20101102180640代表:2010-11-0218:06:44
UD(用户数据,短信内容)部分解码:
字段:userData;属性:UserData。
解码时,先把UD部分PDU串(4F60597D)写入字段UserData。同样,从属性读取到的即为短信内容。
对应get访问器代码:
get
{
intlen=Convert.ToInt32(userDataLenghth,16)*2;
stringresult=string.Empty;
//四个一组,每组译为一个USC2字符
for(inti=0;i<len;i+=4)
{
stringtemp=userData.Substring(i,4);
intbyte1=Convert.ToInt16(temp,16);
result+=((char)byte1).ToString();
}
returnresult;
}
访问UserData即得段内容。示例可得到短信内容:“你好”。