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

📄 hexconv_old.pas

📁 用C++ vc编程的串口通讯软件和源代码
💻 PAS
字号:
unit hexconv;

interface

  function hexchartoint(sourcehex : char) : integer; export;
  function hexstrtoint(sourcestr : string) : integer;  //将类似'FF'的数据转换成#FF
  function moreinttohex(sourceint : integer;style : integer) : string; export;
        //style=1转换为类似#134等字串,style=2转换为类似$F3等字串,和inttohex相同作用
        //最大支持65535(整形的10进制数)
  function IntConvertHex(A: Integer;Len: Integer): string;
        //将一个0-255之间的数字转换成16进制,然后再将这个16进制的值得两个数字拆分,
        //在转换成ASC码,例如:128 -〉80H -〉38H,30H
  function HexConvertInt(A: string): Integer;
        //和IntConvertHex函数的作用刚刚相反

  function DataDispose(S: string): string;
        //(完成准备发送的全部参数)->(计算校验和)->(进行7E,7F等的转换)
        //返回的是全部转换后了的值

  function DataRevert(S: string): string;
        //(接收的全部参数)->(进行7E,7F等的转换)->(计算校验和)
        //返回的是正确的返回值

  function BinStrToInt(AStr: string): Integer;  //2进制字符串转为整形
implementation

uses
  Windows, SysUtils, Variants, Classes, Controls, ExtCtrls, ComCtrls,Dialogs;

function hexchartoint(sourcehex : char) : integer;
const
  HEXDATA =
          #0#1#2#3#4#5#6#7#8#9#10#11#12#13#14#15#16#17#18#19#20+
          #21#22#23#24#25#26#27#28#29#30#31#32#33#34#35#36#37#38#39#40+
          #41#42#43#44#45#46#47#48#49#50#51#52#53#54#55#56#57#58#59#60+
          #61#62#63#64#65#66#67#68#69#70#71#72#73#74#75#76#77#78#79#80+
          #81#82#83#84#85#86#87#88#89#90#91#92#93#94#95#96#97#98#99#100+
          #101#102#103#104#105#106#107#108#109#110+
          #111#112#113#114#115#116#117#118#119#120+
          #121#122#123#124#125#126#127#128#129#130+
          #131#132#133#134#135#136#137#138#139#140+
          #141#142#143#144#145#146#147#148#149#150+
          #151#152#153#154#155#156#157#158#159#160+
          #161#162#163#164#165#166#167#168#169#170+
          #171#172#173#174#175#176#177#178#179#180+
          #181#182#183#184#185#186#187#188#189#190+
          #191#192#193#194#195#196#197#198#199#200+
          #201#202#203#204#205#206#207#208#209#210+
          #211#212#213#214#215#216#217#218#219#220+
          #221#222#223#224#225#226#227#228#229#230+
          #231#232#233#234#235#236#237#238#239#240+
          #241#242#243#244#245#246#247#248#249#250#251#252#253#254#255;
var
  i : integer;
  retint : integer;
begin
  retint := 0;
  for i := 0 to 255 do
  begin
    if sourcehex=HEXDATA[i+1] then
    begin
      retint := i;
      break;
    end;
  end;
  Result := retint;
end;

function DataDispose(S: string): string;
var
  vStrLen: integer;
  vValueVerify: integer;        //校验和
  i,j: integer;
  vRetStr: string;
  //vTmpStr: string;   //暂时存储的
begin
  vStrLen := Length(S)-1;
  vRetStr := Copy(S,1,vStrLen);
  vStrLen := Length(S);
  vValueVerify := 0;

  for i := 1 to vStrLen-1 do
  begin
    vValueVerify := vValueVerify + hexchartoint(S[i]);
  end;

  //if vValueVerify<=255 then
  //  vTmpStr := Copy(moreinttohex(vValueVerify,1),1,1)
  //else
  //  vTmpStr := Copy(moreinttohex(vValueVerify,1),2,1);
  //vRetStr := vRetStr + vTmpStr;
  vRetStr := vRetStr + char(vValueVerify mod $100);

  for i := 1 to vStrLen do
  begin
    vStrLen := Length(vRetStr);
    if vRetStr[i]=#126 then  //如果数据中有7E
    begin
      vRetStr := vRetStr + ' '; //长度加1
      for j := vStrLen downto i+1 do
      begin
        vRetStr[j+1] := vRetStr[j];
      end;
      vRetStr[i] := #125;
      vRetStr[i+1] := #94;
    end
    else if vRetStr[i]= #127 then  //如果数据中有7F
    begin
      vRetStr := vRetStr + ' '; //长度加1
      for j := vStrLen downto i+1 do
      begin
        vRetStr[j+1] := vRetStr[j];
      end;
      vRetStr[i] := #125;
      vRetStr[i+1] := #95;
    end
    else if vRetStr[i]= #125 then  //如果数据中有7D
    begin
      vRetStr := vRetStr + ' '; //长度加1
      for j := vStrLen downto i+1 do
      begin
        vRetStr[j+1] := vRetStr[j];
      end;
      vRetStr[i] := #125;
      vRetStr[i+1] := #93;
    end;
  end;
  Result := vRetStr;
end;

function IntConvertHex(A: Integer;Len: Integer): string;
//最小值应该为0,但是最大值就没有固定的了!有多少,返回多少
const
  cConvertStr = #48#49#50#51#52#53#54#55#56#57#65#66#67#68#69#70;
  //cConvertStr[1..16]=0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
var
  vTmpStr, vTmpChar: string;
  i,vStrLen: Integer;
begin
  vTmpStr := '';  //要返回的字符串,初始化唯空
  if A<0 then A:=0;

  vTmpChar := '';
  vTmpStr := IntToHex(A,Len);
  vStrLen := Length(vTmpStr);
  for i := 1 to vStrLen do
  begin
    vTmpChar := vTmpChar + Copy(vTmpStr,i,1);
    if (vTmpChar[i] in ['0'..'9']) then
      vTmpChar[i] := cConvertStr[StrtoInt(vTmpChar[i])+1]
    else if ((vTmpChar[i]='A') or (vTmpChar[i]='a')) then
      vTmpChar[i] := cConvertStr[11]
    else if ((vTmpChar[i]='B') or (vTmpChar[i]='b')) then
      vTmpChar[i] := cConvertStr[12]
    else if ((vTmpChar[i]='C') or (vTmpChar[i]='c')) then
      vTmpChar[i] := cConvertStr[13]
    else if ((vTmpChar[i]='D') or (vTmpChar[i]='d')) then
      vTmpChar[i] := cConvertStr[14]
    else if ((vTmpChar[i]='E') and (vTmpChar[i]='e')) then
      vTmpChar[i] := cConvertStr[15]
    else if ((vTmpChar[i]='F') and (vTmpChar[i]='f')) then
      vTmpChar[i] := cConvertStr[16]
  end;
  Result := vTmpChar;
end;

function HexConvertInt(A: string): Integer;
//说明:函数最多只支持4位,例如:#128#128#128#128
const
  cConvertStr = #48#49#50#51#52#53#54#55#56#57#65#66#67#68#69#70;
var
  StrLen,i,j: integer;
  tmpstr,GetStr: string;
  ret1,ret2: integer;
begin
  tmpstr := '';
  GetStr := '';
  StrLen := Length(A);
  for j := 1 to StrLen do
  for i := 1 to 16 do
  begin
    if A[j]=cConvertStr[i] then
    begin
      if ((i>=1) and (i<=10)) then
        tmpstr := inttostr(i-1)
      else if i=11 then
        tmpstr := 'A'
      else if i=12 then
        tmpstr := 'B'
      else if i=13 then
        tmpstr := 'C'
      else if i=14 then
        tmpstr := 'D'
      else if i=15 then
        tmpstr := 'E'
      else if i=16 then
        tmpstr := 'F';
      GetStr := GetStr + tmpstr;
      tmpstr := '';
    end;
  end;

  StrLen := Length(GetStr);
  if StrLen<=2 then
  begin
    if StrLen=1 then GetStr := '0' + GetStr;
    Result := hexstrtoint(GetStr);
  end
  else if StrLen<=4 then
  begin
    if StrLen=3 then GetStr := '0' + GetStr;
    ret1 := hexstrtoint(Copy(GetStr,1,2));
    ret2 := hexstrtoint(Copy(GetStr,3,2));
    Result := ret1*256+ret2;
  end
  else  Result := 0;

end;

function moreinttohex(sourceint : integer;style : integer) : string;
const
  HEXDATA =
          #0#1#2#3#4#5#6#7#8#9#10#11#12#13#14#15#16#17#18#19#20+
          #21#22#23#24#25#26#27#28#29#30#31#32#33#34#35#36#37#38#39#40+
          #41#42#43#44#45#46#47#48#49#50#51#52#53#54#55#56#57#58#59#60+
          #61#62#63#64#65#66#67#68#69#70#71#72#73#74#75#76#77#78#79#80+
          #81#82#83#84#85#86#87#88#89#90#91#92#93#94#95#96#97#98#99#100+
          #101#102#103#104#105#106#107#108#109#110+
          #111#112#113#114#115#116#117#118#119#120+
          #121#122#123#124#125#126#127#128#129#130+
          #131#132#133#134#135#136#137#138#139#140+
          #141#142#143#144#145#146#147#148#149#150+
          #151#152#153#154#155#156#157#158#159#160+
          #161#162#163#164#165#166#167#168#169#170+
          #171#172#173#174#175#176#177#178#179#180+
          #181#182#183#184#185#186#187#188#189#190+
          #191#192#193#194#195#196#197#198#199#200+
          #201#202#203#204#205#206#207#208#209#210+
          #211#212#213#214#215#216#217#218#219#220+
          #221#222#223#224#225#226#227#228#229#230+
          #231#232#233#234#235#236#237#238#239#240+
          #241#242#243#244#245#246#247#248#249#250#251#252#253#254#255;
var
  tmp,tmp1,tmp2 : integer;
  ts1,ts2 : Char;
  th1,th2 : string[2];
begin
  moreinttohex := '';  //实际上分配了长度为4的内存区,否则为出错
  tmp := sourceint;
  tmp1 := tmp div 256;
  tmp2 := tmp mod 256;

  th1 := inttohex(tmp1,2);
  th2 := inttohex(tmp2,2);

  if style=1 then
  begin
    if tmp<=255 then
    begin
      ts2 := HEXDATA[tmp2+1];
      moreinttohex := ' ';
      moreinttohex[1] := ts2
    end
    else begin
      ts2 := HEXDATA[tmp1+1];
      ts1 := HEXDATA[tmp2+1];

      moreinttohex := '  ';
      moreinttohex[2] := ts1;   //1->2
      moreinttohex[1] := ts2;   //2->1
    end;
  end
  else if style=2 then
  begin
    if tmp<=255 then begin
      moreinttohex := '  ';
      moreinttohex[1] := th2[1];
      moreinttohex[2] := th2[2];
    end
    else begin
      moreinttohex := '    ';
      moreinttohex[1] := th1[1];
      moreinttohex[2] := th1[2];
      moreinttohex[3] := th2[1];
      moreinttohex[4] := th2[2];
    end;
  end;
end;

function hexstrtoint(sourcestr : string) : integer;
var
  vIntLen : integer;
  vStrVal1,vStrVal2 : string[1];
  vIntVal1,vIntVal2 : integer;
begin
  vIntVal1 := 0;
  vIntVal2 := 0;
  vStrVal1 := '';
  vStrVal2 := '';
  vIntLen := Length(sourcestr);
  if vIntLen > 2 then
  begin
    hexstrtoint := -1;
    exit;
  end
  else if vIntLen=1 then
  begin
    vIntVal1 := 0;
    vStrVal2 := Copy(sourcestr,1,1);

    if ((vStrVal2='0') or (vStrVal2='1') or (vStrVal2='2') or (vStrVal2='3') or
        (vStrVal2='4') or (vStrVal2='5') or (vStrVal2='6') or (vStrVal2='7') or
        (vStrVal2='8') or (vStrVal2='9')) then
      vIntVal2 := strtoint(vStrVal2)
    else if ((vStrVal2='A') or (vStrVal2='a')) then
      vIntVal2 := 10
    else if ((vStrVal2='B') or (vStrVal2='b')) then
      vIntVal2 := 11
    else if ((vStrVal2='C') or (vStrVal2='c')) then
      vIntVal2 := 12
    else if ((vStrVal2='D') or (vStrVal2='d')) then
      vIntVal2 := 13
    else if ((vStrVal2='E') or (vStrVal2='e')) then
      vIntVal2 := 14
    else if ((vStrVal2='F') or (vStrVal2='f')) then
      vIntVal2 := 15;
  end
  else begin
    vStrVal1 := Copy(sourcestr,1,1);
    vStrVal2 := Copy(sourcestr,2,1);
    if ((vStrVal1='0') or (vStrVal1='1') or (vStrVal1='2') or (vStrVal1='3') or
        (vStrVal1='4') or (vStrVal1='5') or (vStrVal1='6') or (vStrVal1='7') or
        (vStrVal1='8') or (vStrVal1='9')) then
      vIntVal1 := strtoint(vStrVal1)
    else if ((vStrVal1='A') or (vStrVal1='a')) then
      vIntVal1 := 10
    else if ((vStrVal1='B') or (vStrVal1='b')) then
      vIntVal1 := 11
    else if ((vStrVal1='C') or (vStrVal1='c')) then
      vIntVal1 := 12
    else if ((vStrVal1='D') or (vStrVal1='d')) then
      vIntVal1 := 13
    else if ((vStrVal1='E') or (vStrVal1='e')) then
      vIntVal1 := 14
    else if ((vStrVal1='F') or (vStrVal1='f')) then
      vIntVal1 := 15;

    if ((vStrVal2='0') or (vStrVal2='1') or (vStrVal2='2') or (vStrVal2='3') or
        (vStrVal2='4') or (vStrVal2='5') or (vStrVal2='6') or (vStrVal2='7') or
        (vStrVal2='8') or (vStrVal2='9')) then
      vIntVal2 := strtoint(vStrVal2)
    else if ((vStrVal2='A') or (vStrVal2='a')) then
      vIntVal2 := 10
    else if ((vStrVal2='B') or (vStrVal2='b')) then
      vIntVal2 := 11
    else if ((vStrVal2='C') or (vStrVal2='c')) then
      vIntVal2 := 12
    else if ((vStrVal2='D') or (vStrVal2='d')) then
      vIntVal2 := 13
    else if ((vStrVal2='E') or (vStrVal2='e')) then
      vIntVal2 := 14
    else if ((vStrVal2='F') or (vStrVal2='f')) then
      vIntVal2 := 15;
  end;

  hexstrtoint := vIntVal1*16+vIntVal2;
end;

function DataRevert(S: string): string;
var
  StrLen: integer;
  ValueVerify: integer;        //校验和
  i: integer;
  ConvertStr, RetStr: string;
  TmpStr: string;   //暂时存储的
begin
  StrLen := Length(S);
  TmpStr := Copy(S,1,1);
  if TmpStr[1] <> char($7e) then   //没有帧头
  begin
    DataRevert := '';   //出错
    exit;
  end;

  TmpStr := Copy(S, StrLen, 1);
  if TmpStr[1] <> char($7f) then   //没有帧尾
  begin
    DataRevert := '';   //出错
    exit;
  end;
  
  ConvertStr := Copy(S, 2, Strlen - 2);   //去掉帧头帧尾的数据
  StrLen := Length(ConvertStr);

  RetStr := '';
  i := 1;
  while i <= StrLen - 1 do
  begin
    if ConvertStr[i]=char($7d) then       //7d
    begin
      case ConvertStr[i+1] of
        char($5e): RetStr := RetStr + char($7e);
        char($5f): RetStr := RetStr + char($7f);
        char($5d): RetStr := RetStr + char($7d);
        else begin
          DataRevert := '';   //出错,返回-1
          exit;
        end;
      end;
      i := i + 2;
    end
    else begin
      RetStr := RetStr + ConvertStr[i];
      if i = StrLen - 1 then
        RetStr := RetStr + ConvertStr[strlen];
      i := i + 1;
    end;
  end;

  StrLen := length(RetStr);
  ValueVerify := 0;
  for i := 1 to StrLen - 1 do
  begin
    ValueVerify := ValueVerify + hexchartoint(RetStr[i]);
  end;
  if ValueVerify <= 255 then
    TmpStr := Copy(moreinttohex(ValueVerify, 1),1,1)
  else
    TmpStr := Copy(moreinttohex(ValueVerify, 1),2,1);
  if TmpStr[1] <> RetStr[StrLen] then  //校验和不符合
  begin
    DataRevert := '';   //出错,返回-1
    exit;
  end;
  
  DataRevert := Copy(RetStr, 1, Length(RetStr)-1);  //去掉了校验和
end;

function BinStrToInt(AStr: string): Integer;  //2进制字符串转为整形
  function CF(ABase, ACF: Integer): Integer;
  var
    i, value: Integer;
  begin
    value := 1;
    for i := 1 to ACF do
      value := value * ABase;
    Result := value;  
  end;
var
  s: string;
  tmp, i: Integer;
begin
  s := AStr;
  
  if 8 < Length(s) then
    s := copy(s, 1, 8)
  else if 8 > Length(s) then
  begin
    tmp := 8 - Length(s);
    for i := 1 to tmp do
      s := '0' + s;
  end;

  tmp := 0;
  for i := 1 to Length(s) do
  begin
    if false = (s[i] in ['0', '1']) then     //先修正数据,避免出现错误
      s[i] := '1';
    if '1' = s[i] then
      tmp := tmp + CF(2, 8-i);
  end;
  Result := tmp;
end;

end.

⌨️ 快捷键说明

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