如何使用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将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
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;