⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bwcrt.pas

📁 利用AT指令,直接控制GSM的控制.实现
💻 PAS
字号:
unit BWCRT;

interface

uses
  SysUtils, StrUtils ;

  //加密函数
  function Encrypt(const S: String; Key: String): String;
  //解密函数
  function Decrypt(const S: String; Key: String): String;

  //字符串转换成十六进制的字符串
  function StrToHex(AStr: String): String;
  //把十六进制的字符串还原
  function HexToStr(AStr: String): String;

  //此函数是用来把16进制的字符,转换成十进制的数字
  function TransChar(AChar: Char): Integer;
  //调换一串字符串中的字符位置
  function ChangePlace(Astr: string): string;
  //把密码字符转换成密码数字
  function NumericPassword(Password: String): LongInt;
  //求次幂
  function BWPower(Base: Longint; exponent: Longint): LongInt;
  //随机生成一串字符串
  function RandGetStr(Num:Byte):string;

const
  C1 = 52845;
  C2 = 22719;
  MIN_ASC = 32; //Space
  MAX_ASC = 126; //~
  NUM_ASC = MAX_ASC - MIN_ASC + 1;

implementation

/////////////////////////////////////////////////////////
//函数名:RandGetStr
//说  明:此函数是用来随机生成一串字符串
//参  数:
//      1、Num:字符数量
//返回值:string
//作  者:卞  伟   2003.6
/////////////////////////////////////////////////////////
function RandGetStr(Num:Byte):string;
var
  I: Byte;
begin
  Result:= '';
  for I:= 1 to Num do
  begin
    Randomize;
    Result:= Result + Chr(Random(93) + 33);
  end;
end;

/////////////////////////////////////////////////////////
//函数名:BWPower
//说  明:此函数是用来求一个长整数的n次方的。
//参  数:
//      1、Base:Longint  基数
//      2、exponent: Longint 次方
//返回值:Long 长整型,返回n次方的值
//作  者:卞  伟   2002.3
/////////////////////////////////////////////////////////
function BWPower(Base: Longint; exponent: Longint): LongInt;
var
  I: Longint;
begin
  Result:= 1;
  for I:= 1 to exponent do
    Result:= Result * Base;
end;

/////////////////////////////////////////////////////////
//函数名:StrToHex
//说  明:此函数是用来把一串字符串转换成十六进制一串数字字符串
//参  数:
//      1、AStr:string  源字符
//返回值:PChar 返回转换后的字符串
//作  者:卞  伟   2002.3
/////////////////////////////////////////////////////////
function StrToHex(AStr: String): String;
var
  I : Integer;
  Temp: String;
begin
  Temp := '';
  For I := 1 to Length(AStr) do
  begin
    Temp := Temp + Format('%2x', [Byte(AStr[I])]);
  end;
  I := Pos(' ', Temp);
  While I <> 0 do
  begin
    Temp[I] := '0';
    I := Pos(' ', Temp);
  end;
//  Result:= PChar(Temp);
  Result:= Temp;
end;

/////////////////////////////////////////////////////////
//函数名:HexToStr
//说  明:此函数是用来把一串十六进制数字字符串还原
//参  数:
//      1、AStr:string  十六进制数字字符串
//返回值:PChar 返回转换后的字符串
//作  者:卞  伟   2002.3
/////////////////////////////////////////////////////////
function HexToStr(AStr: String): String;
var
  I : Integer;
  CharValue: Word;
  Temp: String;
begin
  Temp := '';
  For I := 1 to Trunc(Length(Astr)/2) do
  begin
    Temp := Temp + ' ';
    CharValue := TransChar(AStr[2*I-1])*16 + TransChar(AStr[2*I]);
    Temp[I] := Char(CharValue);
  end;
//  Result:= PChar(Temp);
  Result:= Temp;
end;

/////////////////////////////////////////////////////////
//函数名:TransChar
//说  明:此函数是用来把16进制的字符,转换成十进制的数字
//参  数:
//      1、AChar:Char  源字符
//返回值:Integer 返回数值
//作  者:卞  伟   2002.3
/////////////////////////////////////////////////////////
function TransChar(AChar: Char): Integer;
begin
  if AChar in ['0'..'9'] then
    Result := Ord(AChar) - Ord('0')
  else
    Result := 10 + Ord(AChar) - Ord('A');
end;

/////////////////////////////////////////////////////////
//函数名:ChangePlace
//说  明:调换一串字符串中的字符位置
//参  数:
//      1、Astr:string  源字符
//返回值:string 返回数值
//作  者:卞  伟   2002.3
/////////////////////////////////////////////////////////
function ChangePlace(Astr: string): string;
var
  I: Integer;
begin
  //把字符串中第1个和第3个字符的位置倒置,第2个和第4个的位置倒置
  result:=Astr;

  I:= 4;
  while I < Length(Astr) do
  begin
    result[I - 3] := Astr[I - 1];
    result[I - 1] := Astr[I - 3];
    result[I - 2] := Astr[I];
    result[I] := Astr[I - 2];
    I:= I + 4;
  end;

  if Length(Astr) mod 4 = 3 then
  begin
    result[Length(Astr)] := Astr[Length(Astr) - 1];
    result[Length(Astr) - 1] := Astr[Length(Astr)];
  end;
end;

/////////////////////////////////////////////////////////
//函数名:NumericPassword
//说  明:此函数是用来把密码字符串转换成密码数字。
//参  数:
//      1、Password:String  密码字符串
//返回值:Long 长整型,密码数字。
//作  者:卞  伟   2002.3
/////////////////////////////////////////////////////////
function NumericPassword(Password: String): LongInt;
var
  Shift1,Shift2: LongInt;
  Ch,I,Str_Len: Integer;
begin
  Shift1:= 0;
  Shift2:= 0;
  Result:= 0;
  Str_Len := Length(Password);
  for I:= 1 to Str_Len do
  begin
    ch := Byte(Password[I]);
    Result := Result xor (ch * BWPower(2,Shift1));
    Result := Result xor (ch * BWPower(2,Shift2));
    Shift1 := (Shift1 + 7) mod 19;
    Shift2 := (Shift2 + 13) mod 23;
  end;
end;

/////////////////////////////////////////////////////////
//函数名:Encrypt
//说  明:此函数提供给外接程序所用的加密函数
//参  数:
//      1、S:String  需要加密的字符串
//      2、Key: String  密码字符串
//返回值:加密后的字符串
//作  者:卞  伟   2002.3
/////////////////////////////////////////////////////////
function Encrypt(const S: String; Key: String): String;
var
  I : Integer;
  NumKey: LongInt;
  Temp: String;
begin
  NumKey:= NumericPassword(Key);  //把字符串Key转换成密码数字
  Temp := S;
  for I := 1 to Length(S) do
  begin
    Temp[I] := char(byte(S[I]) xor (NumKey shr 8));
    NumKey := (byte(Temp[I]) + NumKey) * C1 + C2;
    if Temp[I] = Chr(0) then
      Temp[I] := S[I];
  end;

  Temp := StrToHex(Temp);     //转换成十六进制的字符串
  Temp := ChangePlace(Temp);  //调换字符位置

//  Result:= PChar(Temp);
  Result:= Temp;
end;

/////////////////////////////////////////////////////////
//函数名:Decrypt
//说  明:此函数提供给外接程序所用的解密函数
//参  数:
//      1、S:String  需要解密的字符串
//      2、Key: String  密码字符串
//返回值:解密后的字符串
//作  者:卞  伟   2002.3
/////////////////////////////////////////////////////////
function Decrypt(const S: String; Key: string): string;
var
  I: Integer;
  Temp: String;
  NumKey: LongInt;
  Resu: String;
begin
  NumKey:= NumericPassword(Key);  //把字符串Key转换成密码数字

  Temp:= ChangePlace(S);    //调换字符位置
  Temp:= HexToStr(Temp);       //把十六进制的数字字符串还原
  Resu := Temp;

  for I := 1 to Length(Temp) do
  begin
    if char(byte(Temp[I]) xor (NumKey shr 8)) = Chr(0) then
    begin
      Resu[I] := Temp[I];
      NumKey := (byte(Chr(0)) + NumKey) * C1 + C2; //保证Key的正确性
    end else
    begin
      Resu[I] := char(byte(Temp[I]) xor (NumKey shr 8));
      NumKey := (byte(Temp[I]) + NumKey) * C1 + C2;
    end;
  end  ;

//  Result:= PChar(Resu);
  Result:= Resu;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -