比如:
var
a,b:string;
begin
a:='FDEA00453445353AFEFAAACC01';
b:=HexStrToDecStr(a);
Memo1.Text:=b;
end;这个HexStrToDecStr如何写?
var
a,b:string;
begin
a:='FDEA00453445353AFEFAAACC01';
b:=HexStrToDecStr(a);
Memo1.Text:=b;
end;这个HexStrToDecStr如何写?
var
i: integer;
str: string;
begin
str := '';
for i:=1 to Length(a) do
begin
str := str + IntToStr(StrToInt('$'+a[i]));
end;
Result := str;
end;
begin
Result := IntToStr(StrToInt64('$' + sHex));
end;不过FDEA00453445353AFEFAAACC01这个值太大了, 上面这个函数无法处理。
我写了一个,可以转换。不过乘法那个函数写得不好,楼主可以自己重写。function Add(a:string;b:string):string;
var i,g,n,s:integer;
begin
n:=Max(length(a),length(b));
if length(a)>length(b) then
for i:=1 to n-length(b) do b:='0'+b
else
for i:=1 to n-length(a) do a:='0'+a;
Result:='';
g:=0;
for i:=n downto 1 do
begin
s:=StrToInt(a[i])+StrToInt(b[i])+g;
result:=chr(s mod 10 +48)+result;
g:=s div 10;
end;
if g<>0 then result:=IntToStr(g)+result;
end;function Mul(a:string;b:string):string;
var i,j,k,g,n,s:integer;
d,c:string;
begin
c:='0';
g:=0;
n:=Max(length(a),length(b));
if length(a)>length(b)then
for i:=1 to n-length(b) do b:='0'+b
else
for i:=1 to n-length(a) do a:='0'+a;
for j:=n downto 1 do
begin
d:='';
for i:=n downto 1 do
begin
s:=StrToInt(a[j])*StrToInt(b[i])+g;
d:=chr((s mod 10 )+48)+d;
g:=s div 10;
end;
if g<>0 then
begin
d:=IntToStr(g)+d;
g:=0;
end;
for k:=j+1 to n do d:=d+'0';
c:=Add(c,d);
end;
i:=1;
result:='';
while ((c[i]='0')and(i<n)) do i:=i+1;
for k:=i to length(c) do Result:=Result+c[k];
end;function HexStrToDecStr(a: string): string;
var
i,m:integer;
x,d: string;
begin
Result:='0';
d:='1';
for i:=length(a) downto 1 do
begin
m:=(StrToInt('$'+a[i]));
x:=Mul(IntToStr(m),d);
Result:=Add(Result,x);
d:=Mul(d,'16');
end;
end;
数据结构不是很理想,用链表实现最好,为了方便定义个大数组来处理。const
MAX_ARY_LEN = 100;procedure BigAddAry(var value:array of integer;len:integer;value1:array of integer;len1:integer);
var
i:integer;
begin
for i:=1 to len1 do
begin
value[len-i]:=value[len-i]+value1[len1-i];
end; for i:=1 to len do
begin
while(value[len-i]>=10)do
begin
inc(value[len-i-1],1);
inc(value[len-i],-10);
end;
end;
end;procedure BigMulti(var value:array of integer;len:integer;value1:integer);
var
i:integer;
value3:array of integer;
begin
SetLength(value3,len);
for i:=0 to len-1 do
value3[i]:=value[i];
for i:=0 to value1-2 do
begin
BigAddAry(value,len,value3,len);
end;
end;procedure BigPower(var value:array of integer;len:integer;base:integer;Exponent:integer);
var
i,iTemp:integer;
begin
i:=1;
iTemp:=base;
if Exponent=0 then
begin
value[len-i]:=1;
exit;
end;
while(true)do
begin
value[len-i]:=iTemp mod 10;
inc(i);
iTemp:=iTemp div 10;
if(iTemp=0)then
break;
end; for i:=0 to Exponent-2 do
begin
BigMulti(value,len,base);
end;
end;function BigHexToBin(sInput:string):string;
var
s:string;
strValue:string;
value:array of integer;
value2:array of integer;
i,j,iTemp,iValidPos:integer;
begin
SetLength(value,MAX_ARY_LEN);
SetLength(value2,MAX_ARY_LEN);
ZeroMemory(value,MAX_ARY_LEN);
strValue:='';
s:=sInput;
for i:=0 to length(s)-1 do
begin
iTemp:=StrToInt('$'+s[length(s)-i]);
for j:=0 to MAX_ARY_LEN-1 do
value2[j]:=0;
BigPower(value2,MAX_ARY_LEN,16,i);
BigMulti(value2,MAX_ARY_LEN,iTemp);
BigAddAry(value,MAX_ARY_LEN,value2,MAX_ARY_LEN);
end;
iValidPos:=-1;
for i:=0 to MAX_ARY_LEN-1 do
begin
if(value[i]<>0) then
iValidPos:=i; if iValidPos>0 then
strValue:=strValue+IntToStr(value[i]);
end;
Result:=strValue;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption:=BigHexToBin(Edit1.Text);
end;
我再找找有没有更快的算法。
Edit2.Text := BigHexToBin(Edit1.Text);
Edit3.Text := HexStrToDecStr(Edit1.Text);结果:
Edit1.Text = 'FDEA00453445353AFEFAAACC01'
Edit2.Text = '20117165486953510572811788930065'
Edit3.Text = '20117144935214577124115818925057'
我的代码有错误,写得太仓促了,没考虑到的地方,这个函数换一下:procedure BigMulti(var value:array of integer;len:integer;value1:integer);
var
i:integer;
value3:array of integer;
begin
if value1=0 then
begin
for i:=0 to len-1 do
value[i]:=0;
end else
begin
SetLength(value3,len);
for i:=0 to len-1 do
value3[i]:=value[i]; for i:=0 to value1-2 do
begin
BigAddAry(value,len,value3,len);//首位溢出未处理,len足够大可以避免
end;
end;
end;