恭喜,你发布的帖子
发布于 2017-11-22 14:00:21
1楼
补下中文编码的代码:
public class PDUEncoder
{
/// <summary>
/// 服务中心地址编码(SCA = Service Center Adress)
/// </summary>
/// <param name="SCA">服务中心地址</param>
/// <returns>编码后的字符串</returns>
/// <remarks>
/// SCA组成:1~12个八位位组
/// A:服务中心地址长度,长度1,其值为B+C字节数
/// B:服务中心地址类型,长度0~1
/// C:服务中心地址,长度0~10。
/// </remarks>
private static string SCAEncoding(string SCA)
{
if (string.IsNullOrEmpty(SCA))
{ // 表示使用SIM卡内部的设置值,该值通过AT+CSCA指令设置
return "00";
}
StringBuilder sb = new StringBuilder(SCA.Length + 5);
int Index = 0;
if (SCA.StartsWith("+"))
{ // 国际号码
sb.Append((SCA.Length / 2 + 1).ToString("X2")); // SCA长度编码
sb.Append("91"); // SCA类型编码
Index = 1;
}
else
{ // 国内号码
sb.Append(((SCA.Length + 1) / 2 + 1).ToString("X2")); // SCA长度编码
sb.Append("81"); // SCA类型编码
}
// SCA地址编码
for (; Index < SCA.Length; Index += 2)
{ // 号码部分奇偶位对调
if (Index == SCA.Length - 1)
{
sb.Append(SCA[Index]);
}
else
{
sb.Append(SCA[Index + 1]);
}
}
return sb.ToString();
}
/// <summary>
/// 接收方地址编码
/// </summary>
/// <param name="DA">接收方地址</param>
/// <returns>编码后的字符串</returns>
/// <remarks>
/// DA组成:2~12个八位位组
/// F:地址长度,长度1。注意:其值是接收方地址长度,而非字节数
/// G:地址类型,长度1,取值同B。
/// H:地址,长度0~10。
/// </remarks>
private static string DAEncoding(string DA)
{
if (string.IsNullOrEmpty(DA))
{ // 地址长度0,地址类型未知
return "0080";
}
StringBuilder sb = new StringBuilder(DA.Length + 5);
sb.Append("1100");
int Index = 0;
if (DA.StartsWith("+"))
{ // 国际号码
sb.Append((DA.Length - 1).ToString("X2")); // 地址长度编码
sb.Append("91"); // 地址类型
Index = 1;
}
else
{ // 国内号码
sb.Append(DA.Length.ToString("X2")); // 地址长度编码
sb.Append("81"); // 地址类型
}
for (; Index < DA.Length; Index += 2)
{ // 号码部分奇偶位对调
if (Index == DA.Length - 1)
{
sb.Append("F"); // 补“F”凑成偶数个
}
else
{
sb.Append(DA[Index + 1]);
sb.Append(DA[Index]);
}
}
return sb.ToString();
}
/// <summary>
/// 用户数据内容编码
/// </summary>
/// <param name="UDC">用户数据内容</param>
/// <param name="UDCL">输出:UCS2编码字节数或7-Bit编码字符数</param>
/// <returns>编码字符串</returns>
private static string UDCEncoding(string UDC, out int UDCL)
{
if (string.IsNullOrEmpty(UDC))
{
UDCL = 0;
return string.Empty;
}
// UCS2编码
UDCL = UDC.Length; // 字节数
StringBuilder sb = new StringBuilder(UDCL << 1);
foreach (char Letter in UDC)
{
sb.Append(Convert.ToInt32(Letter).ToString("X4"));
}
return sb.ToString();
}
/// <summary>
/// 获取PDU
/// </summary>
/// <param name="SCA">服务中心地址</param>
/// <param name="DA">短信发送地址</param>
/// <param name="msg">短信内容</param>
/// <param name="DALen">数据长度</param>
/// <returns></returns>
public static string GetPDU(string SCA, string DA, string msg,out int DALen)
{
string SCAPdu = SCAEncoding(SCA);
string DAPdu = DAEncoding(DA);
int len = 0;
string UDCPdu = UDCEncoding(msg, out len);
StringBuilder sb = new StringBuilder();
sb.Append(SCAPdu).Append(DAPdu).Append(len.ToString("X2")).Append(UDCPdu);
DALen = (sb.Length - SCAPdu.Length) / 2;
return sb.ToString();
}
}
推荐帖推荐理由:代码体现解决问题的思路(推荐人:'Razor)
请填写推广理由:
分享
只看
楼主