gpt4 book ai didi

Delphi:BinToHex() 可以在第一个参数中接受字符串形式的实数二进制数(以 2 为基数)吗?

转载 作者:行者123 更新时间:2023-12-02 01:11:59 24 4
gpt4 key购买 nike

概述

幸运的是,Delphi 有一个 RTL 函数,可以将二进制值转换为其十六进制表示形式,即 BinToHex() ,在System.Classes中声明如下:

1.  procedure BinToHex(const Buffer: TBytes; BufOffset: Integer; var Text: TBytes; TextOffset: Integer; Count: Integer);
2. procedure BinToHex(Buffer: PAnsiChar; Text: PAnsiChar; BufSize: Integer);
3. procedure BinToHex(Buffer: PAnsiChar; Text: PWideChar; BufSize: Integer);
4. procedure BinToHex(var Buffer; Text: PWideChar; BufSize: Integer);
5. procedure BinToHex(var Buffer; Text: PAnsiChar; BufSize: Integer);
6. procedure BinToHex(Buffer: Pointer; Text: PWideChar; BufSize: Integer);
7. procedure BinToHex(Buffer: Pointer; Text: PAnsiChar; BufSize: Integer);

Delphi 文档指出,第一个参数,即 Buffer 是一个指向字节数组的指针。这意味着该函数需要作为字节数组传递的二进制数。因此,将二进制转换为十六进制的一种可能方法如下:

procedure Test();
var
aBinNum : TBytes;
sHexNum : string;
iBinSize: Integer;

begin
aBinNum := TBytes.Create(255, 7); // An array of decimal numbers, right?
iBinSize := Length(aBinNum) * 2;
SetLength(sHexNum, iBinSize);
BinToHex(aBinNum, PWideChar(sHexNum), iBinSize);
WriteLn(sHexNum); // The output is FF07
end;

这种方法的问题在于,二进制数必须写成十进制数,因为不存在这样的0b11111111 0b0111 as in GCC ,例如。

binary number定义以来是一个以 2 进制表示的数字,我希望 BinToHex() 可以接收一个真正的 2 进制数字,也许以字符串的形式

问题

是否可以使用 BinToHex() 的第三种形式,以便我可以将真实的以 2 为基数的数字传递给函数?

如果不可能,可能应将 BinToHex() 重命名为 DecToHex()BytesToHex()。只是在开玩笑。 :-)

最佳答案

BinToHex 并不像您所期望的那样从整数的二进制表示形式进行转换。它所做的只是将字节数组编码为十六进制。例如。如果您传递 BinToHex 以下字节:

1, 2, 255

然后 BinToHex 会将其编码为:

0102ff

二进制意味着简单的字节数组。它并不意味着表示以 2 为基数表示的整数。

您正在寻找这样的函数:

function Base2TextToInt(const Text: string): Cardinal;
var
Index: Integer;
Digit: Cardinal;
begin
Digit := 1;
Result := 0;
for Index := Length(Text) downto 1 do
begin
case Text[Index] of
'0':
; // do nothing
'1':
inc(Result, Digit);
else
raise EConvertError.CreateFmt('''%s'' is not a valid binary digit.', [Text[Index]]);
end;
Digit := Digit shl 1;
end;
end;

请注意,我忽略了超过 32 位数字的错误情况。我将把它作为练习留给读者。

<小时/>

人们常见的误解之一是数字可以是十进制数,也可以是二进制数,等等。十进制、二进制等只是数字的表示。因此,十进制 15 等于十六进制 f 等于二进制 1111。这些都是相同的数字,但表示方式不同。

现在,在计算机上,如果您想区分数字的表示形式,可以使用文本来实现。当你写:

i := 15;
j := $f;

您已为 ij 分配了相同的值。你可以这样写

Assert(i = j);

如果您希望在源代码中输入数字的二进制表示形式,那么您就不走运了。 Delphi 仅支持十进制和十六进制表示。

如果您希望将数字转换为其二进制表示形式,反之亦然,您可以使用我上面给出的函数。该函数将存储在字符串中的二进制表示形式转换为数字。

关于Delphi:BinToHex() 可以在第一个参数中接受字符串形式的实数二进制数(以 2 为基数)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31224664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com