1、缺省的GSM 字符集为7位编码,可以简单地理解为ASCII码(ASCII值小于80Hex,因此,Bit8被忽略),依次将下一7位编码的后几位逐次移至前面,形成新的8位编码,参见表2箭头指示。需要注意的是第9行,移位计数已达7位,则直接将本编码前加0。function Encode1(var s:String):String;
var
i,j,len:Integer;
cur:Integer;
t:String;
begin
Result:='';
len:=Length(s);
//j 用于移位计数
i:=1;j:=0;
while i<=len do
begin
if i<len then
//数据变换
cur:=(ord(s[i]) shr j) or ((ord(s[i+1]) shl (7-j)) and $ff)
else
cur:=(ord(s[i]) shr j) and $7f;
FmtStr(t,'%2.2X',[cur]);
Result:=Result+t;
inc(i);
//移位计数达到7位的特别处理
j:=(j+1) mod 7;
if j=0 then inc(i);
end;
end;2、通过Delphi的WideString类型转换,可以巧妙地实现GB2312到Unicode的编码转换
function TForm1.EncodeCn(s: WideString): string;
var
i, len: Integer;
cur: Integer;
t: string;
begin
Result := '';
len := Length(s);
i := 1;
while i <= len do
begin
cur := ord(s[i]);
FmtStr(t, '%4.4X', [cur]);
Result := Result + t;
inc(i);
end;
end;我现在想求两个相反的函数。
var
i,j,len:Integer;
cur:Integer;
t:String;
begin
Result:='';
len:=Length(s);
//j 用于移位计数
i:=1;j:=0;
while i<=len do
begin
if i<len then
//数据变换
cur:=(ord(s[i]) shr j) or ((ord(s[i+1]) shl (7-j)) and $ff)
else
cur:=(ord(s[i]) shr j) and $7f;
FmtStr(t,'%2.2X',[cur]);
Result:=Result+t;
inc(i);
//移位计数达到7位的特别处理
j:=(j+1) mod 7;
if j=0 then inc(i);
end;
end;2、通过Delphi的WideString类型转换,可以巧妙地实现GB2312到Unicode的编码转换
function TForm1.EncodeCn(s: WideString): string;
var
i, len: Integer;
cur: Integer;
t: string;
begin
Result := '';
len := Length(s);
i := 1;
while i <= len do
begin
cur := ord(s[i]);
FmtStr(t, '%4.4X', [cur]);
Result := Result + t;
inc(i);
end;
end;我现在想求两个相反的函数。
var
i:integer;
sTemp:string;
begin
for i:=0 to Length(sUnicode) do
begin
if i mod 4 =0 then
begin
sTemp:=copy(sUnicode,i-3,4);
sTemp:=WideChar(StrToIntDef('$' +sTemp, 0));
Result:=Result+sTemp;
end;
end;
end;
{
int nSrc; // 源字符串的计数值
int nDst; // 目标解码串的计数值
int nByte; // 当前正在处理的组内字节的序号,范围是0-6
unsigned char nLeft; // 上一字节残余的数据
// 计数值初始化
nSrc = 0;
nDst = 0;
// 组内字节序号和残余数据初始化
nByte = 0;
nLeft = 0;
// 将源数据每7个字节分为一组,解压缩成8个字节
// 循环该处理过程,直至源数据被处理完
// 如果分组不到7字节,也能正确处理
while(nSrc<nSrcLength)
{
// 将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节
*pDst = ((*pSrc << nByte) | nLeft) & 0x7f;
// 将该字节剩下的左边部分,作为残余数据保存起来
nLeft = *pSrc >> (7-nByte);
// 修改目标串的指针和计数值
pDst++;
nDst++;
// 修改字节计数值
nByte++;
// 到了一组的最后一个字节
if(nByte == 7)
{
// 额外得到一个目标解码字节
*pDst = nLeft;
// 修改目标串的指针和计数值
pDst++;
nDst++;
// 组内字节序号和残余数据初始化
nByte = 0;
nLeft = 0;
}
// 修改源串的指针和计数值
pSrc++;
nSrc++;
}
*pDst = 0;
// 返回目标串长度
return nDst;
}
逐句翻译.function gsmDecode7bit(const pSrc:pchar;pDst:pchar;nSrcLength:integer);
var
nSrc,nDst,nByte:integer;
nLeft:integer;
begin
nSrc:=0;
nDst:=0; nByte:=0;
nLeft:=chr(0); while nSrc<nSrcLength do
begin
pDst^:=chr(((ord(pSrc^) shl nByte) or nLeft) and $7F);
nLeft:=ord(pSrc^) shr (7-nByte);
inc(pDst);
inc(nDst); inc(nByte); if nByte=7 then
begin
pDst^=chr(nLeft);
inc(pDst);
inc(nDst); nByte:=0;
nLeft:=0;
end;
inc(pSrc);
inc(nSrc);
end; pDst^:=chr(0);
result:=nDst;
end;只是翻译过来,未经测试.另:你是不是想写短信程序呀?我有个编解码的UNIT
[email protected]
function HexCharToInt(HexToken : char):Integer; //十六进制转整数
begin
{if HexToken>#97 then HexToken:=Chr(Ord(HexToken)-32);
{ use lowercase aswell } Result:=0; if (HexToken>#47) and (HexToken<#58) then { chars 0....9 }
Result:=Ord(HexToken)-48
else if (HexToken>#64) and (HexToken<#71) then { chars A....F }
Result:=Ord(HexToken)-65 + 10;
end; function HexCharToBin(HexToken : char): string; //十六进制转二进制
var DivLeft : integer;
begin
DivLeft:=HexCharToInt(HexToken); { first HEX->BIN }
Result:='';
{ Use reverse dividing }
repeat { Trick; divide by 2 }
if odd(DivLeft) then { result = odd ? then bit = 1 }
Result:='1'+Result { result = even ? then bit = 0 }
else
Result:='0'+Result; DivLeft:=DivLeft div 2; { keep dividing till 0 left and length = 4 }
until (DivLeft=0) and (length(Result)=4); { 1 token = nibble = 4 bits }
end; function HexToBin(HexNr : string): string;
{ only stringsize is limit of binnr }
var Counter : integer;
begin
Result:=''; for Counter:=1 to length(HexNr) do
Result:=Result+HexCharToBin(HexNr[Counter]);
end; function pow(base, power: integer): integer; //乘方
var counter : integer;
begin
Result:=1; for counter:=1 to power do
Result:=Result*base;
end; function BinStrToInt(BinStr : string) : integer; //二进制转INT
var counter : integer;
begin
if length(BinStr)>16 then
raise ERangeError.Create(#13+BinStr+#13+
'is not within the valid range of a 16 bit binary.'+#13); Result:=0; for counter:=1 to length(BinStr) do
if BinStr[Counter]='1' then
Result:=Result+pow(2,length(BinStr)-counter);
end; function DecodeSMS7Bit(PDU : string):string; //SMS解码
var OctetStr : string;
OctetBin : string;
Charbin : string;
PrevOctet: string;
Counter : integer;
Counter2 : integer;
begin
PrevOctet:='';
Result:=''; for Counter:=1 to length(PDU) do
begin
if length(PrevOctet)>=7 then { if 7 Bit overflow on previous }
begin
if BinStrToInt(PrevOctet)<>0 then
Result:=Result+Chr(BinStrToInt(PrevOctet))
else Result:=Result+' '; PrevOctet:='';
end; if Odd(Counter) then { only take two nibbles at a time }
begin
OctetStr:=Copy(PDU,Counter,2);
OctetBin:=HexToBin(OctetStr); Charbin:='';
for Counter2:=1 to length(PrevOctet) do
Charbin:=Charbin+PrevOctet[Counter2]; for Counter2:=1 to 7-length(PrevOctet) do
Charbin:=OctetBin[8-Counter2+1]+Charbin; if BinStrToInt(Charbin)<>0 then Result:=Result+Chr(BinStrToInt(CharBin))
else Result:=Result+' '; PrevOctet:=Copy(OctetBin,1,length(PrevOctet)+1);
end;
end;
end; function ReverseStr(SourceStr : string) : string; //字符串反转
var Counter : integer;
begin
Result:=''; for Counter:=1 to length(SourceStr) do
Result:=SourceStr[Counter]+Result;
end; end.