如何使用delphi和hex到octal将hexa转换为dec?

时间:2017-11-25 17:44:24

标签: delphi

function HexToDec(Str: string): Integer;
var
i, M: Integer;
begin
Result:=0;
M:=1;
Str:=AnsiUpperCase(Str);
for i:=Length(Str) downto 1 do
begin
case Str[i] of
  '1'..'9': Result:=Result+(Ord(Str[i])-Ord('0'))*M;
  'A'..'F': Result:=Result+(Ord(Str[i])-Ord('A')+10)*M;
end;
M:=M shl 4;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if Edit1.Text<>'' then
Label2.Caption:=IntToStr(HexToDec(Edit1.Text));
end;

如何在没有函数的情况下使用它,因为我想在其他行中再次调用结果,以及hexa到octal怎么样?我必须从hexa转换到dec然后转到octal吗?

2 个答案:

答案 0 :(得分:5)

Delphi已经可以做到这一点,因此您不需要编写解析数字的函数。实际上很简单:

function HexToDec(const Str: string): Integer;
begin
  if (Str <> '') and ((Str[1] = '-') or (Str[1] = '+')) then
    Result := StrToInt(Str[1] + '$' + Copy(Str, 2, MaxInt))
  else
    Result := StrToInt('$' + Str);
end;

请注意,这也会处理负十六进制数字或+$1234等数字。

  

如何在没有功能的情况下使用它,因为我想在其他行再次调用结果?

如果您想重新使用该值,请将HexToDec的结果分配给变量,并在IntToStr中使用该结果。

FWIW,在你的函数中,不需要调用AnsiUpperCase,因为无论如何所有十六进制数字都在ASCII范围内。更简单的UpperCase也应该有用。

答案 1 :(得分:2)

我的第一个评论是你没有使用你的函数将十六进制转换为十进制(虽然你将十进制转换为中间值),而是十六进制转换为整数。 IntToStr然后有效地将整数转换为基数10。为了概括你想要的东西,我将创建两个函数 - strBaseToInt和IntToStrBase,其中Base意味着暗示例如16表示十六进制,10表示十进制,8表示八进制等,并假设惯例采用六角形A = 10,依此类推,但(可能)Z = 35,使最大基数为36。

我不处理+或 - 但可以轻松添加。

在反向功能中,为了简化说明,我已经省略了支持负值。

修改

感谢Rudy的改进

编辑2 - 根据评论添加溢出测试

function StrBaseToInt(const Str: string; const Base : integer): Integer;
var
  i, iVal, iTest: Longword;
begin
  if (Base > 36) or (Base < 2) then raise Exception.Create('Invalid Base');
  Result:=0;
  iTest := 0;
  for i:=1 to Length(Str) do
  begin
    case Str[i] of
      '0'..'9': iVal := (Ord(Str[i])-Ord('0'));
      'A'..'Z': iVal := (Ord(Str[i])-Ord('A')+10);
      'a'..'z': iVal := (Ord(Str[i])-Ord('a')+10);
      else raise Exception.Create( 'Illegal character found');
    end;
    if iVal < Base then
    begin
      Result:=Result * Base + iVal;
      if Result < iTest then  // overflow test!
      begin
        raise Exception.Create( 'Overflow occurred');
      end
      else
      begin
        iTest := Result;
      end;
    end
    else
    begin
      raise Exception.Create( 'Illegal character found');
    end;
  end;
end;

然后,例如你的HexToOct函数看起来像这样

function HexToOct( Value : string ) : string;
begin
  Result := IntToStrBase( StrBaseToInt( Value, 16), 8 );
end;

其他

一般功能是

function BaseToBase( const Value : string; const FromBase, ToBase : integer ) : string;
begin
  Result := IntToStrBase( StrBaseToInt( Value, FromBase ),ToBase );
end;