深圳市未来时代科技有限公司
标题:
C#实现PUD编码
[打印本页]
作者:
admin
时间:
2014-3-7 18:51
标题:
C#实现PUD编码
本文详细介绍编码的方案及程序,下一篇是解码的程序,谢谢大家的支持。
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默认编码值。
短消息服务中心编码
set //
{
if (value == null || value.Length == 0) //号码为空 短消息中心号码为空 则SCA部分编码为”00”
{
serviceCenterAddress = "00";
}
else
{
if (value[0] == '+') //去掉服务中心前导加号
{
value = value.TrimStart('+');
}
if (value.Substring(0, 2) != "86")
{
value = "86" + value; //服务中心加86
}
value = "91" + ParityChange(value); //国际码
serviceCenterAddress = (value.Length / 2).ToString("X2") + value;
}
}
复制代码
其中ParityChange函数位字符串奇偶互换(并+F)代码如下:
奇偶互换函数
/// <summary>
/// 奇偶互换 (+F)
/// </summary>
/// <param name="str">要被转换的字符串</param>
/// <returns>转换后的结果字符串</returns>
private string ParityChange(string str)
{
string result = string.Empty;
if (str.Length % 2 != 0) //奇字符串 补F
{
str += "F";
}
for (int i = 0; i < str.Length; i += 2)
{
result += str[i + 1];
result += str[i];
}
return result;
}
复制代码
(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编码
set
{
if (value == null || value.Length == 0) //号码为空
{
destinationAddress = "00";
}
else
{
if (value[0] == '+')
{
value = value.TrimStart('+');
}
if (value.Substring(0, 2) == "86")
{
value = value.TrimStart('8', '6');
}
int len = value.Length;
value = ParityChange(value);
destinationAddress = len.ToString("X2") + "A1" + value;
}
}
复制代码
UDL和UD部分(用户数据长度,用户数据即短信内容):
写UD(用户数据时,完成数据部分的编码和用户数据长度部分的计算与赋值;程序如下:
UD,UDL编
set
{
userData = string.Empty;
//数据部分字符串赋空值,以便写入编码
Encoding encodingUTF = Encoding.BigEndianUnicode;
//Encoding.BigEndianUnicode可直接完成数据编码与高低字节的交换,若用Unicode需再加高低字节的互换
byte[] Bytes = encodingUTF.GetBytes(value);
for (int i = 0; i < Bytes.Length; i++)
{
userData += BitConverter.ToString(Bytes, i, 1);
}
userDataLenghth = (userData.Length / 2).ToString("X2"); //完成UDL计算与赋值(1个8位组)
}
复制代码
编码函数:
这种编码方案优势即编码函数很简单,只需把对应字段相加即可
PDU编
/// <summary>
/// PDU编码器,完成PDU编码(USC2编码,最多70个字)
/// </summary>
/// <param name="phone">目的手机号码</param>
/// <param name="Text">短信内容</param>
/// <returns>编码后的PDU字符串</returns>
public string PDUEncoder(string phone, string Text)
{
if (Text.Length > 70)
{
throw (new Exception("短信字数超过70"));
}
DestinationAddress = phone;
UserData = Text;
return serviceCenterAddress + protocolDataUnitType
+ messageReference + destinationAddress + protocolIdentifer
+ dataCodingScheme + validityPeriod + userDataLenghth + userData;
}
复制代码
项目文件:
项目工程文件.rar
(134.42 KB, 下载次数: 3415)
2014-3-7 18:47 上传
点击文件名下载附件
欢迎光临 深圳市未来时代科技有限公司 (http://inextera.com/)
Powered by Discuz! X3.1