www.pudn.com > java_delphi.rar > BinHexTools.pas


unit BinHexTools; 
 
 
 {===============================================================}  
{ 函数  : RESULTSTRING = HexToBin(HEXSTRING)  
{ 目的   : 把十六进制字符串转换为二进制字符串    
{  
{===============================================================} 
{ 函数  : RESULTINTEGER = HexCharToInt(HEXCHAR)  
{ 目的   : 转换一个十六进制字符为整数 
{===============================================================}  
{ 函数  : RESULTSTRING = HexCharToBin(HEXCHAR)  
{ 目的   : 转换一个十六进制字符为二进制字符串 
{===============================================================}  
{ 函数  : RESULTINTEGER = Pow(BASE,POWER)  
{ 目的   : 指数函数 
{===============================================================}  
{ 函数  : RESULTINTEGER = BinStrToInt(BINSTRING)  
{ 目的   : 把二进制字符串转换为整数 
{===============================================================}  
{ 函数  : RESULTSTRING = DecodeSMS7Bit (PDUSTRING)  
{ 目的   : 解码一个7-bit SMS (GSM 03.38) 为ASCII码  
{===============================================================}  
{ 函数  :  RESULTSTRING = ReverseStr (SOURCESTRING)  
{ 目的   : 反转一个字符串 
{===============================================================}  
 
 
 
interface  
 
function HexToBin(HexNr : string): string;  
function HexCharToInt(HexToken : char):Integer;  
function HexCharToBin(HexToken : char): string;  
function pow(base, power: integer): integer;  
function BinStrToInt(BinStr : string) : integer;  
function DecodeSMS7Bit(PDU : string):string;  
function ReverseStr(SourceStr : string) : string;  
function ExchangeCode(src:string):string; 
implementation  
 
uses sysutils, dialogs;  
 
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;  
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;  
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;  
function ExchangeCode(src:string):string; 
var 
  strTmp:string; 
  srcLen:integer; 
  i:integer; 
begin 
  strTmp := ''; 
  srcLen := length(src); 
  {if (srcLen <> 11) and (srcLen <> 13) then 
  begin 
    ExchangeCode := ''; 
    exit; 
  end;} 
 
  //src := src+'F'; 
  i := 1; 
  while i<= srcLen do 
  begin 
    strTmp := strTmp + src[i+1]+src[i]; 
    inc(i,2); 
  end; 
  ExchangeCode := strTmp; 
end; 
end. 
end.