查看: 10438|回复: 0
打印 上一主题 下一主题

C#实现PUD编码

[复制链接]
跳转到指定楼层
楼主
发表于 2014-3-7 18:51:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本文详细介绍编码的方案及程序,下一篇是解码的程序,谢谢大家的支持。

PDU编码,即发送方PDU格式:包括SCA,PDU-Type,MR,DA,PID,DCS,VP,UDL,UD九个部分。详细请参考:《PDU格式短信编码的原理,实现短信收发设备收发中文短信
编码利用类属性访问的特点编写:字段对应属性,PDU的每个部分对应一组字段属性,写属性时对字段写入对应部分的PDU编码,编码函数从字段值得到,直接返回各个字符串的对应PDU值。计划编解码放入一个类,属性读取即得解码后的值,解码函数读对应属性值即得到解码后的字符串(短信内容、字符串等)。

SCA(Service Center Address,短消息服务中心)编码:

字段serviceCenterAddress存储其PDU编码后的十六进制字符串,属性ServiceCenterAddress控制程序对serviceCenterAddress的访问,写属性ServiceCenterAddress 时即完成对SCA部分的编码。字段serviceCenterAddress默认值:”00”,即SCA默认编码值。

短消息服务中心编码
  1. set                 //
  2. {
  3.     if (value == null || value.Length == 0)      //号码为空 短消息中心号码为空 则SCA部分编码为”00”
  4.     {
  5.         serviceCenterAddress = "00";
  6.     }
  7.     else
  8.     {
  9.         if (value[0] == '+')                    //去掉服务中心前导加号
  10.         {
  11.             value = value.TrimStart('+');
  12.         }
  13.         if (value.Substring(0, 2) != "86")
  14.         {
  15.             value = "86" + value;               //服务中心加86
  16.         }
  17.         value = "91" + ParityChange(value);     //国际码
  18.         serviceCenterAddress = (value.Length / 2).ToString("X2") + value;
  19.     }
  20.    
  21. }
复制代码


其中ParityChange函数位字符串奇偶互换(并+F)代码如下:
奇偶互换函数
  1. /// <summary>
  2. /// 奇偶互换 (+F)
  3. /// </summary>
  4. /// <param name="str">要被转换的字符串</param>
  5. /// <returns>转换后的结果字符串</returns>
  6. private string ParityChange(string str)
  7. {
  8.     string result = string.Empty;
  9.     if (str.Length % 2 != 0)         //奇字符串 补F
  10.     {
  11.         str += "F";
  12.     }
  13.     for (int i = 0; i < str.Length; i += 2)
  14.     {
  15.         result += str[i + 1];
  16.         result += str[i];
  17.     }
  18.     return result;
  19. }
复制代码


(value.Length / 2).ToString("X2") 为把value的值除以2并转化为十六进制字符串(X2:格式串 两位16进制)。详见MSDN。
PDU-Type(PDU类型)编码:直接取值为”11”,

        private string protocolDataUnitType = "11";
        MR,PID,DCS,VP:暂时均直接取值,以下不再说明。

DA(目的地址 目的手机号或其他号码):

       编码方案和SCA部分相同DA编码
  1. set
  2. {
  3.     if (value == null || value.Length == 0)      //号码为空
  4.     {
  5.         destinationAddress = "00";
  6.     }
  7.     else
  8.     {
  9.         if (value[0] == '+')
  10.         {
  11.             value = value.TrimStart('+');
  12.         }
  13.         if (value.Substring(0, 2) == "86")
  14.         {
  15.             value = value.TrimStart('8', '6');
  16.         }
  17.         int len = value.Length;
  18.         value = ParityChange(value);
  19.         destinationAddress = len.ToString("X2") + "A1" + value;
  20.     }
  21. }
复制代码

UDL和UD部分(用户数据长度,用户数据即短信内容):

           写UD(用户数据时,完成数据部分的编码和用户数据长度部分的计算与赋值;程序如下:
UD,UDL编
  1. set
  2. {
  3.     userData = string.Empty;        
  4. //数据部分字符串赋空值,以便写入编码
  5.     Encoding encodingUTF = Encoding.BigEndianUnicode;
  6. //Encoding.BigEndianUnicode可直接完成数据编码与高低字节的交换,若用Unicode需再加高低字节的互换
  7.     byte[] Bytes = encodingUTF.GetBytes(value);
  8.     for (int i = 0; i < Bytes.Length; i++)
  9.     {
  10.         userData += BitConverter.ToString(Bytes, i, 1);
  11.     }
  12.     userDataLenghth = (userData.Length / 2).ToString("X2");  //完成UDL计算与赋值(1个8位组)
  13. }
复制代码

编码函数:

这种编码方案优势即编码函数很简单,只需把对应字段相加即可
PDU编
  1. /// <summary>
  2. /// PDU编码器,完成PDU编码(USC2编码,最多70个字)
  3. /// </summary>
  4. /// <param name="phone">目的手机号码</param>
  5. /// <param name="Text">短信内容</param>
  6. /// <returns>编码后的PDU字符串</returns>
  7. public string PDUEncoder(string phone, string Text)
  8. {
  9.     if (Text.Length > 70)
  10.     {
  11.         throw (new Exception("短信字数超过70"));
  12.     }
  13.     DestinationAddress = phone;
  14.     UserData = Text;
  15.     return serviceCenterAddress + protocolDataUnitType
  16.         + messageReference + destinationAddress + protocolIdentifer
  17.         + dataCodingScheme + validityPeriod + userDataLenghth + userData;
  18. }
复制代码

项目文件: 项目工程文件.rar (134.42 KB, 下载次数: 3181)




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|未来时代科技 ( 粤ICP备12044031号-1

GMT+8, 2024-4-29 05:28 , Processed in 0.068660 second(s), 29 queries .

Powered by WLSD X3.1

© 2013-2014 WLSD Inc.

快速回复 返回顶部 返回列表
 
【电话】(15118131494)
【QQ】 未来时代科技01 售前咨询
【QQ】 未来时代科技02 售后技术
【旺旺】 请问有什么可以帮到您?不在线可留言.
【邮箱】
inextera@sina.com
【地址】 (深圳市龙岗坂田扬马小区)