📄 hexconv_old.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 + -