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分送上。
已知编码时用了如下方法:
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分送上。