关于接收短信时7bit解码问题--------在线等,急用(100分)

  • 主题发起人 主题发起人 happycyp
  • 开始时间 开始时间
H

happycyp

Unregistered / Unconfirmed
GUEST, unregistred user!
在接收纯英文短信(7bit编码)时,在解码时用居然出了乱码。

已知编码时用了如下方法:
function Encode1(s:String):String;
var
i,j,len:Integer; //j 用于移位计数
cur:Integer;
t:String;
begin
Result := '';
len := Length(s);
i := 1;
j := 0;
while i<=len do
begin
if i<len then //数据变换
begin
cur := (ord(s) shr j) or ((ord(s[i+1]) shl (7-j)) and $FF)
end else
begin
cur:=(ord(s) shr j) and $7F;
end;
FmtStr(t,'%2.2X',[cur]);
Result:=Result+t;
inc(i);
j:=(j+1) mod 7;if j=0 then inc(i); //移位计数达到7位的特别处理
end;
end;
//---------------------------------------
解码时也有C++版的,代码如下:
// 7-bit解码
// pSrc: 源编码串指针
// pDst: 目标字符串指针
// nSrcLength: 源编码串长度
// 返回: 目标字符串长度
int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
int nSrc; // 源字符串的计数值
int nDst; // 目标解码串的计数值
int nByte; // 当前正在处理的组内字节的序号,范围是0-6
unsigned char nLeft; // 上一字节残余的数据

// 计数值初始化
nSrc = 0;
nDst = 0;

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

// 将源数据每7个字节分为一组,解压缩成8个字节
// 循环该处理过程,直至源数据被处理完
// 如果分组不到7字节,也能正确处理
while(nSrc> (7-nByte);

// 修改目标串的指针和计数值
pDst++;
nDst++;

// 修改字节计数值
nByte++;

// 到了一组的最后一个字节
if(nByte == 7)
{
// 额外得到一个目标解码字节
*pDst = nLeft;

// 修改目标串的指针和计数值
pDst++;
nDst++;

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

// 修改源串的指针和计数值
pSrc++;
nSrc++;
}

*pDst = 0;

// 返回目标串长度
return nDst;
}
请根据以上信息给出DELPHI的版的解码方案,在线等。急用。
100分送上。
 
编码原理见:
http://dev.csdn.net/article/17/17465.shtm
 
//// 7-bit解码
//// pSrc: 源编码串指针
//// nSrcLength: 源编码串长度
//// 返回: 目标字符串
function gsmDecode7bit(pSrc: PByte; nSrcLength: Integer): string;
var
nSrc, nDst, nByte, nDstLen: Integer;
nLeft: Byte;
pDst, pOldDst: PByte;
begin
// 计数值初始化
nSrc := 0; nDst := 0;

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

// 目标串大小(估计)
nDstLen := ((nSrcLength div 7) + 1) * 8;
GetMem(pDst, nDstLen);
pOldDst := pDst;

// 将源数据每7个字节分为一组,解压缩成8个字节
// 循环该处理过程,直至源数据被处理完
// 如果分组不到7字节,也能正确处理
while (nSrc < nSrcLength) do
begin
// 将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节
pDst^ := ((pSrc^ shl nByte) or nLeft) and $7f;
// 将该字节剩下的左边部分,作为残余数据保存起来
nLeft := pSrc^ shr (7 - nByte);

// 修改目标串的指针和计数值
Inc(pDst);
Inc(nDst);

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

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

// 修改目标串的指针和计数值
Inc(pDst);
Inc(nDst);

// 组内字节序号和残余数据初始化
nByte := 0;
nLeft := 0;
end;
// 修改源串的指针和计数值
Inc(pSrc);
Inc(nSrc);
end;

pDst^ := 0;
Result := StrPas(PChar(pOldDst));
FreeMem(pOldDst);
end;
 
完全从C++代码中硬翻过来, 见谅[:)]
 
中文的兼容英文的吧?
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
806
import
I
后退
顶部