短信文本模式下的解码方法

接收短信有两种编码格式:
1.中英文混合的为unicode
2.英文的为7BIT编码。
以7BIT编码为例子,如接收到PDU码为
0891683108502905F0040D91685159296028F30000701021216182230947759B4C0F93E967
08 //短消息中心长度
91 //短消息中心有国家编码 没有为81
683108502905F0//短信中心号码
685159296028F3//发送方手机号码
0000//编码格式=7BTT格式(0008为unicode)
70102121618223//时间
09//消息长度
47759B4C0F93E967//短信内容,7BIT解码为:Gjmdtadtg

附DELPHI中对unicode和7BIT解码函数

//unicode解码
function U2GB(Str: string): string;
var s: pchar;
i: integer;
tmp: string;
begin
tmp := '';
result := '';
s := PChar(str);
i := 0;
while i < length(s) do
begin
tmp := tmp + chr(HexToInt(s[i + 2] + s[i + 3])) + chr(HexToInt(s + s[i + 1]));//unicode转换时,高低位互换
inc(i, 4);
end;
result := widechartostring(pWideChar(tmp + #0#0#0#0));
end;

 

//7BIT短信内容解码
function TFrm_DtuCall.gsmDecode7bit(pSrc:string; nSrcLength:Integer):string;
//pSrc内容
//nSrcLength内容长度
var
nSrc:Integer; // 源字符串的计数值
nByte:Integer; // 当前正在处理的组内字节的序号,范围是0-6
nLeft:Byte; // 上一字节残余的数据
tmpChar:Byte;
pDst:string;

begin

// 计数值初始化
nSrc := 1;

// 组内字节序号和残余数据初始化
nByte := 0;
nLeft := 0;
pdst := '';
// 将源数据每7个字节分为一组,解压缩成8个字节
// 循环该处理过程,直至源数据被处理完
// 如果分组不到7字节,也能正确处理
while (nSrc < nSrcLength) do
begin
tmpChar := byte(StrToInt('$' + pSrc[nsrc] + pSrc[nsrc + 1]));
// 将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节
pDst := pDst + Char(((tmpchar shl nByte) or nLeft) and $7F);
// 将该字节剩下的左边部分,作为残余数据保存起来
nLeft := tmpChar shr (7 - nByte);

// 修改字节计数值
Inc(nByte);

// 到了一组的最后一个字节
if (nByte = 7) then
begin
// 额外得到一个目标解码字节
pdst := pDst + Char(nLeft);

// 组内字节序号和残余数据初始化
nByte := 0;
nLeft := 0;
end;

// 修改源串的指针和计数值

nSrc := nSrc + 2;
end;
// 返回目标串长度
result := pdst;
end; 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值