比如:
var
  a,b:string;
begin
  a:='FDEA00453445353AFEFAAACC01';
  b:=HexStrToDecStr(a);
  Memo1.Text:=b;
end;这个HexStrToDecStr如何写?

解决方案 »

  1.   

    要经过一次中间转换,帮你完成HexStrToDecStr吧function HexStrToDecStr(a: string): string;
    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;
      

  2.   

    function HexStrToDecStr(sHex: String): String;
    begin
      Result := IntToStr(StrToInt64('$' + sHex));
    end;不过FDEA00453445353AFEFAAACC01这个值太大了, 上面这个函数无法处理。
      

  3.   

    是啊。不大就用Delphi自己的函数了。
      

  4.   

    其实就是多精度的加法和乘法的运算。
    我写了一个,可以转换。不过乘法那个函数写得不好,楼主可以自己重写。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;
      

  5.   

    刚刚写了个,新鲜出炉:
    数据结构不是很理想,用链表实现最好,为了方便定义个大数组来处理。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;
      

  6.   

    gzmhero(hihihi)的算法要快一些。100多位10进制差不多0.1秒左右,liangqingzhi(老之)的要不多要5秒左右。
    我再找找有没有更快的算法。
      

  7.   

    不能光看速度嘛,似乎两个函数得到的结果不一致,呵呵  Edit1.Text := 'FDEA00453445353AFEFAAACC01';
      Edit2.Text := BigHexToBin(Edit1.Text);
      Edit3.Text := HexStrToDecStr(Edit1.Text);结果:
      Edit1.Text = 'FDEA00453445353AFEFAAACC01'
      Edit2.Text = '20117165486953510572811788930065'
      Edit3.Text = '20117144935214577124115818925057'
      

  8.   

    汗一个,楼上的厉害。
    我的代码有错误,写得太仓促了,没考虑到的地方,这个函数换一下: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;