您的位置:首页 > 编程语言 > C#

短信猫软件的实现(C#)<八>7bitPDU的解码

2010-11-07 17:10 253 查看

前几天实现的类库中有一个比较严重的问题,接收到ASCII码,7bit编码的短信读取到的短信内容是乱码,这样控件无法投入使用。原因是类库中没有对应的解码程序,全部按USC2的编码进行的解码。本文介绍的程序加入这部分代码解决这一问题,前面的工程项目文件同时更新这部分内容,需要的欢迎下载。

先看下PDU的7bit编码:
PDU编码详见:短信猫软件的实现(C#)<三>PDU格式短信解析

英文编码:7bit编码,依次将下一位的后几位移至前面形成新的8位编码
示例:Test
T:01010100e:01100101s:01110011t:01110100
去最高位0,变为7位
T:1010100e:1100101s:1110011t:1110100
后面低位移至前面形成8位编码
Test:11010100111100101001110000001110
UD:D4F29C0EUDL:04

解码算法:使用循环;每次循环读取一个位组(已存入字节缓冲区);转化为二进制字符串,取低位和对应上个位组剩下的二进制位组成7bitASCII码,加入结果数组。

privatestringPDU7bitDecoder(stringuserData)

{

stringresult=string.Empty;

byte[]b=newbyte[100];

stringtemp=string.Empty;


for(inti=0;i<userData.Length;i+=2)

{

b[i/2]=(byte)Convert.ToByte((userData[i].ToString()+userData[i+1].ToString()),16);

}


intj=0;//while计数

inttmp=1;//temp中二进制字符字符个数

while(j<userData.Length/2-1)

{

strings=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);

}

}

returnresult;

}



类库中的其他改动:

UserDataget访问器:加入对这部分代码的调用:

get

{

intlen=Convert.ToInt32(userDataLenghth,16)*2;

stringresult=string.Empty;


if(dataCodingScheme=="08"||dataCodingScheme=="18")新加入判断//USC2编码

{

//四个一组,每组译为一个USC2字符

for(inti=0;i<len;i+=4)

{

stringtemp=userData.Substring(i,4);


intbyte1=Convert.ToInt16(temp,16);


result+=((char)byte1).ToString();

}

}

else

{

result=PDU7bitDecoder(userData);加入调用7bit

}


returnresult;

}


原来代码中未用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循环,解决只收到一个英文字符时,解码内容为空的问题2011-04-11文件修改后内容在:

短信猫软件的实现(C#)系列博客索引中


附件:工程项目文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航