1.英文编码function Encode7bit(Src:String):String;var Dst:String; i:Integer; CurS,NextS:Byte; TStr:String;begin for i:=1 to Length(Src) do begin //当前是字符按8位分组的第8位,无需编码(8个字符已缩短为7个) if (i mod 8)=0 then Continue; //取当前位为数字 TStr:=Copy(Src,i,1); CurS:=Ord(TStr[1]);
//当前右移位组中的第一个字符不移位 if (i mod 8)>1 then CurS:=(CurS shr ((i mod 8)-1) );
//取后一位为数字如果到了字符的结束,不取 if i<Length(Src) then begin TStr:=Copy(Src,i+1,1); NextS:=Ord(TStr[1]); end else NextS:=0; //后一位移位 左移 NextS:=(NextS shl (8-(i mod 8)));
//当前移位后加后一位移位后 转换成为十六进制 Dst:=Dst+IntToHex(CurS+NextS,2); end; Result:=Dst;end;
2、英文解码function Decode7bit(Src:String):String;var Dst:String; i:Integer; CurS,ProiS:Byte;begin for i:=1 to (Length(Src) div 2) do begin //将当前位的十六进制转换为十进制 CurS:=StrToInt('$'+Copy(Src,(i-1)*2+1,2)); //32->50 //取前一位十六进制转换为十进制 if (i mod 7)<>1 then ProiS:=StrToInt('$'+Copy(Src,(i-2)*2+1,2)) //C8->200 else ProiS:=0; //前一位右移,即将当前字符前移的位取出来 if (i mod 7)>0 then ProiS:=(ProiS shr (9-(i mod 7))) else ProiS:=(ProiS shr 2); //当前位左移除掉高位 if (i mod 7)>0 then CurS:=(CurS shl (i mod 7) ) else CurS:=(CurS shl 7 ); //将第八位设置为0 CurS:=(CurS shr 1); Dst:=Dst+Chr(CurS+ProiS); //第七个十六进制内已包含有一个完整的字符 if (i mod 7)=0 then begin CurS:=StrToInt('$'+Copy(Src,(i-1)*2+1,2)); //32->50 CurS:=(CurS shr 1); Dst:=Dst+Chr(CurS); end; end;//en for Result:=Dst;end;
3.中文编码function CnToUSC(var 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]); //BCD转换 FmtStr(t,'%4.4X',[cur]); Result:=Result+t; inc(i); end; end;
4、PDU解码function TForm1.DecodeChinese(SRC: String): string; //中文解码var i:Integer; S:String; D:WideChar; ResultW:WideString;begin for i:=1 to Round(Length(Src)/4) do begin S:=Copy(Src,(i-1)*4+1,4); D:=WideChar(StrToInt('$'+s)); //此处是重点,用delphi提供的widechar可以转换 ResultW:=ResultW+D; end; Result:=ResultW;end;