深圳市未来时代科技有限公司
标题:
短信收发设备c#实现7bitPDU的解码
[打印本页]
作者:
admin
时间:
2014-3-12 17:58
标题:
短信收发设备c#实现7bitPDU的解码
前天发表的那篇
c#实现API接口
文章中实现的类库中有一个比较严重的问题,接收到ASCII码,7bit编码的短信读取到的短信内容是乱码,这样控件无法投入使用。原因是类库中没有对应的解码程序,全部按USC2的编码进行的解码。本文介绍的程序加入这部分代码解决这一问题,前面的工程项目文件同时更新这部分内容,需要的欢迎下载。
先看下PDU的7bit编码:
PDU编码详见:
PDU格式短信解析
英文编码:7bit编码,依次将下一位的后几位移至前面形成新的8位编码
示例:Test
T:01010100 e:01100101 s:01110011 t:01110100
去最高位0,变为7位
T:1010100 e:1100101 s:1110011 t:1110100
后面低位移至前面形成8位编码
Test:11010100111100101001110000001110
UD: D4F29C0E UDL:04
解码算法:使用循环;每次循环读取一个位组(已存入字节缓冲区);转化为二进制字符串,取低位和对应上个位组剩下的二进制位组成7bit ASCII码,加入结果数组。
private string PDU7bitDecoder(string userData)
{
string result = string.Empty;
byte[] b = new byte[100];
string temp = string.Empty;
for (int i = 0; i < userData.Length; i += 2)
{
b[i / 2] = (byte)Convert.ToByte((userData[i].ToString() + userData[i + 1].ToString()),16);
}
int j = 0; //while计数
int tmp = 1; //temp中二进制字符字符个数
while (j < userData.Length / 2 - 1)
{
string s = string.Empty;
s = Convert.ToString(b[j], 2);
while (s.Length < 8) //s补满8位 byte转化来的 有的不足8位,直接解码将导致错误
{
s = "0" + s;
}
result += (char)Convert.ToInt32(s.Substring(tmp) + temp, 2); //加入一个字符 结果集 temp 上一位组剩余
temp = s.Substring(0, tmp); //前一位组多的部分
if (tmp > 6) //多余的部分满7位,加入一个字符
{
result += (char)Convert.ToInt32(temp, 2);
temp = string.Empty;
tmp = 0;
}
tmp++;
j++;
if (j == userData.Length / 2 - 1) //最后一个字符
{
result += (char)Convert.ToInt32(Convert.ToString(b[j], 2) + temp, 2);
}
}
return result;
}
复制代码
类库中的其他改动:
UserData get访问器:加入对这部分代码的调用:
get
{
int len = Convert.ToInt32(userDataLenghth, 16) * 2;
string result = string.Empty;
if (dataCodingScheme == "08" || dataCodingScheme == "18") 新加入判断 //USC2编码
{
//四个一组,每组译为一个USC2字符
for (int i = 0; i < len; i += 4)
{
string temp = userData.Substring(i, 4);
int byte1 = Convert.ToInt16(temp, 16);
result += ((char)byte1).ToString();
}
}
else
{
result = PDU7bitDecoder(userData); 加入调用7bit
}
return result;
}
复制代码
原来代码中未用DCS(解码时),现在需加入:
解码函数:加入DCS写入
dataCodingScheme = strPDU.Substring(lenSCA + lenOA + 4, 2); //DCS赋值,区分解码7bit
复制代码
另外还改动了
userData = strPDU.Substring(lenSCA + lenOA + 22);
复制代码
句。原来有子字符串长度,由于7bit编码和USC2编码长度计算不太一样,去掉此参数,直接取到字符串尾。
现在,一个可用的类库完成了,虽然功能还不是很强。
带改动的地方:7bit编码的加入等;现在ASCII码短信的发送使用的也是USC2编码,显然过于浪费空间(7bit编码一条短信可发160字符,USC2仅70个字符)。
如果想让上篇
实现的猫程序
能够识别7bit编码(只是接收),把今天生成的DLL文件覆盖上一篇用的文件即可,其他地方不必改动。
更新部分:解码函数while循环,改成do-while循环,解决只收到一个英文字符时,解码内容为空的问题
工程附件:
GSMMODEM 已修改.rar
(134.42 KB, 下载次数: 3293)
2014-3-12 17:43 上传
点击文件名下载附件
欢迎光临 深圳市未来时代科技有限公司 (http://inextera.com/)
Powered by Discuz! X3.1