如何使用delphi将hexa转换为dec,并将hex转换为八进制? 函数HexToDec(Str:string):整数; 变量 i、 M:整数; 开始 结果:=0; M:=1; Str:=AnsiUpperCase(Str); 对于i:=长度(Str)向下至1 do 开始 案件Str[i] '1'..'9':结果:=Result+(Ord(Str[i])-Ord('0'))*M; 结果:=Result+(Ord(Str[i])-Ord('A')+10)*M; 结束; M:=mshl4; 结束; 结束; 程序TForm1.按钮1单击(发送方:TObject); 开始 如果是Edit1.Text“”,则 标签2.标题:=IntToStr(HexToDec(Edit1.Text)); 结束;

如何使用delphi将hexa转换为dec,并将hex转换为八进制? 函数HexToDec(Str:string):整数; 变量 i、 M:整数; 开始 结果:=0; M:=1; Str:=AnsiUpperCase(Str); 对于i:=长度(Str)向下至1 do 开始 案件Str[i] '1'..'9':结果:=Result+(Ord(Str[i])-Ord('0'))*M; 结果:=Result+(Ord(Str[i])-Ord('A')+10)*M; 结束; M:=mshl4; 结束; 结束; 程序TForm1.按钮1单击(发送方:TObject); 开始 如果是Edit1.Text“”,则 标签2.标题:=IntToStr(HexToDec(Edit1.Text)); 结束;,delphi,Delphi,如何使用它而不使用函数,因为我想在另一行中再次调用结果,那么如何使用十六进制到八进制呢?我必须从十六进制转换到十进制,然后再从十进制转换到八进制吗?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

如何使用它而不使用函数,因为我想在另一行中再次调用结果,那么如何使用十六进制到八进制呢?我必须从十六进制转换到十进制,然后再从十进制转换到八进制吗?

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;
函数HexToDec(const Str:string):整数; 开始 如果(Str“”)和((Str[1]='-')或(Str[1]='+')),则 结果:=stroint(Str[1]+'$'+复制(Str,2,MaxInt)) 其他的 结果:=stroint(“$”+Str); 结束; 请注意,它还处理负十六进制数,或像
+$1234
这样的数字

由于我想在另一行再次调用结果,如何在没有函数的情况下使用它

如果要重复使用该值,请将
HexToDec
的结果指定给一个变量,并在
IntToStr
中使用该变量



FWIW,在您的函数中,不需要调用
AnsiUpperCase
,因为所有十六进制数字都在ASCII范围内。一个简单得多的大写字母也应该可以使用。

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;
函数HexToDec(const Str:string):整数; 开始 如果(Str“”)和((Str[1]='-')或(Str[1]='+')),则 结果:=stroint(Str[1]+'$'+复制(Str,2,MaxInt)) 其他的 结果:=stroint(“$”+Str); 结束; 请注意,它还处理负十六进制数,或像
+$1234
这样的数字

由于我想在另一行再次调用结果,如何在没有函数的情况下使用它

如果要重复使用该值,请将
HexToDec
的结果指定给一个变量,并在
IntToStr
中使用该变量



FWIW,在您的函数中,不需要调用
AnsiUpperCase
,因为所有十六进制数字都在ASCII范围内。一个简单得多的大写字母应该也能起作用。

我的第一个评论是,你不是在用你的函数将十六进制转换成十进制(尽管你是在将十进制转换成中间值),而是将十六进制转换成整数。IntToStr然后有效地将整数转换为基数10。为了概括您想要的,我将创建两个函数-strBaseToInt和IntToStrBase,其中Base意味着16代表十六进制,10代表十二进制,8代表八进制,等等,并假设十六进制采用的约定是A=10,依此类推,但(可能)Z=35,使得最大基数可能为36

我不处理+或-但这可以很容易地添加

在相反的函数中,同样为了说明的简单性,我建议支持负值

编辑 感谢鲁迪的改进

编辑2-根据注释添加溢出测试 附加的 一般功能是

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

我的第一个评论是,您并没有使用函数将十六进制转换为十进制(尽管您将作为中间值转换为十进制),而是将十六进制转换为整数。IntToStr然后有效地将整数转换为基数10。为了概括您想要的,我将创建两个函数-strBaseToInt和IntToStrBase,其中Base意味着16代表十六进制,10代表十二进制,8代表八进制,等等,并假设十六进制采用的约定是A=10,依此类推,但(可能)Z=35,使得最大基数可能为36

我不处理+或-但这可以很容易地添加

在相反的函数中,同样为了说明的简单性,我建议支持负值

编辑 感谢鲁迪的改进

编辑2-根据注释添加溢出测试 附加的 一般功能是

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

有点令人沮丧的是,他涉及到堆分配。有什么RTL函数可以避免这种情况吗?@David:我想不出有什么RTL函数。但这有那么重要吗?在某些情况下,这可能是一件大事。通常我不同意。避免堆分配的唯一方法是改进OP函数的版本,即对每个十六进制数字进行解析、移位和加法。如果情况需要最高速度,我会编写一个,否则我会使用ˋstrotointˋ。我最近编写了自己的
IntToStr
FloatToStr
类型方法来处理固定长度的字符数组。这是我的YAML代码。当创建满是数字的大文件时,这对性能有了巨大的改进。遗憾的是RTL没有这些功能。his涉及到堆分配,这有点令人沮丧。有什么RTL函数可以避免这种情况吗?@David:我想不出有什么RTL函数。但这有那么重要吗?在某些情况下,这可能是一件大事。通常我不同意。避免堆分配的唯一方法是改进OP函数的版本,即对每个十六进制数字进行解析、移位和加法。如果情况需要最高速度,我会编写一个,否则我会使用ˋstrotointˋ。我最近编写了自己的
IntToStr
FloatToStr
类型方法来处理固定长度的字符数组。这是我的YAML代码。当创建满是数字的大文件时,这对性能有了巨大的改进。遗憾的是,RTL没有这些功能。如果你有一个转换为任何基地,那么为什么停止在基地16?您的基数已测试为在2..36范围内,但您仅为基数2..16编码(最多为
'F'
)。而对于基数12,
'F'
则是非法的。你也应该检查一下,即数字Sor
function BaseToBase( const Value : string; const FromBase, ToBase : integer ) : string;
begin
  Result := IntToStrBase( StrBaseToInt( Value, FromBase ),ToBase );
end;