public DecodedMessage PDUDecoder(int SmsIndex, string strPDU) { int lenSCA = 0; //错误PDU时可能抛出异常 int lenOA; int lenPDU = strPDU.Length; try { lenSCA = Convert.ToInt32(strPDU.Substring(0, 2), 16) * 2 + 2; //短消息中心占长度 //int lenSCA = Convert.ToInt32(strPDU.Substring(0, 2), 16) * 2 + 2; //短消息中心占长度 serviceCenterAddress = strPDU.Substring(0, lenSCA); //PDU-type位组 protocolDataUnitType = strPDU.Substring(lenSCA, 2); lenOA = Convert.ToInt32(strPDU.Substring(lenSCA + 2, 2), 16); //OA占用长度 if (lenOA % 2 == 1) //奇数则加1 F位 { lenOA++; } lenOA += 4; //加号码编码的头部长度 originatorAddress = strPDU.Substring(lenSCA + 2, lenOA); dataCodingScheme = strPDU.Substring(lenSCA + lenOA + 4, 2); //DCS赋值,区分解码7bit serviceCenterTimeStamp = strPDU.Substring(lenSCA + lenOA + 6, 14); userDataLength = strPDU.Substring(lenSCA + lenOA + 20, 2); int lenUD = Convert.ToInt32(userDataLength, 16) * 2; } catch (Exception ex) { //由于解码出来SubString中引用的长度与字StrPdu实际长度不一致,因而加大异常捕获范围 throw new Exception(ex.Message + " PDU:" + strPDU); } if ((Convert.ToInt32(protocolDataUnitType, 16) & 0x40) != 0) //长短信 { if (dataCodingScheme.Substring(1, 1) == "8") //USC2 长短信 去掉消息头 { try { userDataLength = (Convert.ToInt16(strPDU.Substring(lenSCA + lenOA + 20, 2), 16) - 6).ToString("X2"); userData = strPDU.Substring(lenSCA + lenOA + 22 + 6 * 2); } catch (Exception ex) { //由于解码出来SubString中引用的长度与字StrPdu实际长度不一致,因而加大异常捕获范围 throw new Exception(ex.Message + " LongMSG1-PDU:" + strPDU); } return(new DecodedMessage(SmsIndex, strPDU.Substring(lenSCA + lenOA + 22 + 4 * 2, 2 * 2) + strPDU.Substring(lenSCA + lenOA + 22 + 3 * 2, 2) , ServiceCenterAddress , ServiceCenterTimeStamp.Substring(0, 4) + "-" + ServiceCenterTimeStamp.Substring(4, 2) + "-" + ServiceCenterTimeStamp.Substring(6, 2) + " " + ServiceCenterTimeStamp.Substring(8, 2) + ":" + ServiceCenterTimeStamp.Substring(10, 2) + ":" + ServiceCenterTimeStamp.Substring(12, 2) , OriginatorAddress, UserData, UserData_Old)); } else { try { userData = strPDU.Substring(lenSCA + lenOA + 22 + 6 * 2 + 1 * 2); //消息头六字节,第一字节特殊译码 >>7 } catch (Exception ex) { //由于解码出来SubString中引用的长度与字StrPdu实际长度不一致,因而加大异常捕获范围 throw new Exception(ex.Message + " LongMSG2-PDU:" + strPDU); } //首字节译码 byte byt = Convert.ToByte(strPDU.Substring(lenSCA + lenOA + 22 + 6 * 2, 2), 16); char first = (char)(byt >> 1); return(new DecodedMessage(SmsIndex, strPDU.Substring(lenSCA + lenOA + 22 + 4 * 2, 2 * 2) + strPDU.Substring(lenSCA + lenOA + 22 + 3 * 2, 2) , ServiceCenterAddress , ServiceCenterTimeStamp.Substring(0, 4) + "-" + ServiceCenterTimeStamp.Substring(4, 2) + "-" + ServiceCenterTimeStamp.Substring(6, 2) + " " + ServiceCenterTimeStamp.Substring(8, 2) + ":" + ServiceCenterTimeStamp.Substring(10, 2) + ":" + ServiceCenterTimeStamp.Substring(12, 2) , OriginatorAddress , first + UserData, UserData_Old)); } } try { userData = strPDU.Substring(lenSCA + lenOA + 22); } catch (Exception ex) { //由于解码出来SubString中引用的长度与字StrPdu实际长度不一致,因而加大异常捕获范围 throw new Exception(ex.Message + " SMSUserData-PDU:" + strPDU); } return(new DecodedMessage(SmsIndex, "010100" , ServiceCenterAddress , ServiceCenterTimeStamp.Substring(0, 4) + "-" + ServiceCenterTimeStamp.Substring(4, 2) + "-" + ServiceCenterTimeStamp.Substring(6, 2) + " " + ServiceCenterTimeStamp.Substring(8, 2) + ":" + ServiceCenterTimeStamp.Substring(10, 2) + ":" + ServiceCenterTimeStamp.Substring(12, 2) , OriginatorAddress , UserData, UserData_Old)); }
/* * /// <summary> * /// 完成手机或短信猫收到PDU格式短信的解码 暂时仅支持中文编码 * /// 未用DCS部分 * /// </summary> * /// <param name="strPDU">短信PDU字符串</param> * /// <param name="msgCenter">短消息服务中心 输出</param> * /// <param name="phone">发送方手机号码 输出</param> * /// <param name="msg">短信内容 输出</param> * /// <param name="time">时间字符串 输出</param> * public void PDUDecoder(string strPDU, out string msgCenter, out string phone, out string msg, out string time) * { * int lenSCA = Convert.ToInt32(strPDU.Substring(0, 2), 16) * 2 + 2; //短消息中心占长度 * serviceCenterAddress = strPDU.Substring(0, lenSCA); * * int lenOA = Convert.ToInt32(strPDU.Substring(lenSCA + 2, 2),16); //OA占用长度 * if (lenOA % 2 == 1) //奇数则加1 F位 * { * lenOA++; * } * lenOA += 4; //加号码编码的头部长度 * originatorAddress = strPDU.Substring(lenSCA + 2, lenOA); * * dataCodingScheme = strPDU.Substring(lenSCA + lenOA + 4, 2); //DCS赋值,区分解码7bit * * serviceCenterTimeStamp = strPDU.Substring(lenSCA + lenOA + 6, 14); * * userDataLenghth = strPDU.Substring(lenSCA + lenOA + 20, 2); * int lenUD = Convert.ToInt32(userDataLenghth, 16) * 2; * userData = strPDU.Substring(lenSCA + lenOA + 22); * * msgCenter = ServiceCenterAddress; * phone = OriginatorAddress; * msg = UserData; * time = ServiceCenterTimeStamp; * } */ #endregion 解码注释掉 /// <summary> /// 重载 解码,返回信息字符串 格式 /// </summary> /// <param name="strPDU">短信PDU字符串</param> /// <returns>信息字符串(MMNN,中心号码,手机号码,发送时间,短信内容 MM这批短信总条数 NN本条所在序号)</returns> public DecodedMessage PDUDecoder(string strPDU) { int lenSCA = Convert.ToInt32(strPDU.Substring(0, 2), 16) * 2 + 2; //短消息中心占长度 serviceCenterAddress = strPDU.Substring(0, lenSCA); //PDU-type位组 protocolDataUnitType = strPDU.Substring(lenSCA, 2); int lenOA = Convert.ToInt32(strPDU.Substring(lenSCA + 2, 2), 16); //OA占用长度 if (lenOA % 2 == 1) //奇数则加1 F位 { lenOA++; } lenOA += 4; //加号码编码的头部长度 originatorAddress = strPDU.Substring(lenSCA + 2, lenOA); dataCodingScheme = strPDU.Substring(lenSCA + lenOA + 4, 2); //DCS赋值,区分解码7bit serviceCenterTimeStamp = strPDU.Substring(lenSCA + lenOA + 6, 14); userDataLenghth = strPDU.Substring(lenSCA + lenOA + 20, 2); int lenUD = Convert.ToInt32(userDataLenghth, 16) * 2; if ((Convert.ToInt32(protocolDataUnitType, 16) & 0x40) != 0) //长短信 { if (dataCodingScheme.Substring(1, 1) == "8") //USC2 长短信 去掉消息头 { userDataLenghth = (Convert.ToInt16(strPDU.Substring(lenSCA + lenOA + 20, 2), 16) - 6).ToString("X2"); userData = strPDU.Substring(lenSCA + lenOA + 22 + 6 * 2); return(new DecodedMessage(strPDU.Substring(lenSCA + lenOA + 22 + 4 * 2, 2 * 2) + strPDU.Substring(lenSCA + lenOA + 22 + 3 * 2, 2) , ServiceCenterAddress , ServiceCenterTimeStamp.Substring(0, 4) + "-" + ServiceCenterTimeStamp.Substring(4, 2) + "-" + ServiceCenterTimeStamp.Substring(6, 2) + " " + ServiceCenterTimeStamp.Substring(8, 2) + ":" + ServiceCenterTimeStamp.Substring(10, 2) + ":" + ServiceCenterTimeStamp.Substring(12, 2) , OriginatorAddress, UserData)); } else { userData = strPDU.Substring(lenSCA + lenOA + 22 + 6 * 2 + 1 * 2); //消息头六字节,第一字节特殊译码 >>7 //首字节译码 byte byt = Convert.ToByte(strPDU.Substring(lenSCA + lenOA + 22 + 6 * 2, 2), 16); char first = (char)(byt >> 1); return(new DecodedMessage(strPDU.Substring(lenSCA + lenOA + 22 + 4 * 2, 2 * 2) + strPDU.Substring(lenSCA + lenOA + 22 + 3 * 2, 2) , ServiceCenterAddress , ServiceCenterTimeStamp.Substring(0, 4) + "-" + ServiceCenterTimeStamp.Substring(4, 2) + "-" + ServiceCenterTimeStamp.Substring(6, 2) + " " + ServiceCenterTimeStamp.Substring(8, 2) + ":" + ServiceCenterTimeStamp.Substring(10, 2) + ":" + ServiceCenterTimeStamp.Substring(12, 2) , OriginatorAddress , first + UserData)); } } userData = strPDU.Substring(lenSCA + lenOA + 22); return(new DecodedMessage("010100" , ServiceCenterAddress , ServiceCenterTimeStamp.Substring(0, 4) + "-" + ServiceCenterTimeStamp.Substring(4, 2) + "-" + ServiceCenterTimeStamp.Substring(6, 2) + " " + ServiceCenterTimeStamp.Substring(8, 2) + ":" + ServiceCenterTimeStamp.Substring(10, 2) + ":" + ServiceCenterTimeStamp.Substring(12, 2) , OriginatorAddress , UserData)); }