gpt4 book ai didi

delphi - 用delphi进行128位操作

转载 作者:行者123 更新时间:2023-12-02 13:00:58 25 4
gpt4 key购买 nike

我需要将十六进制值转换为十进制整数。有没有单位可以做到这一点?

在网上我找到了一些相关内容,但它对我没有多大帮助。据我所知,使用inline asm可以将其表示为四个32位Integer的压缩数组。我发现将 int32 或 int64 转换为 int128,反之亦然,但没有找到任何东西,例如两个 int64 并执行 int128,而且我也发现在 asm 内联搜索 emule div 的问题运算符、mul 运算符和 sum 运算符。

所以我问是否有人可以帮我解决这个问题。我的目标是获取十六进制字符串并将其转换为十进制,然后计算 base 35 中的等效值(0..9,A..Z)。非常感谢。

最佳答案

如果将十六进制字符串转换为字节数组(请参阅 SysUtils),则可以使用以下代码将其转换为基数 35:

function EncodeBaseX( const Values: array of Byte; var Dest: array of Byte; Radix: Integer ): Boolean;
var
i,j,Carry: Integer;
begin
// We're unsuccesful up to now
Result := False;

// Check if we have an output buffer and clear it
if Length( Dest ) = 0 then Exit;
System.FillChar( Dest[ 0 ], Length( Dest ), 0 );

// fill in the details
for i := 0 to High( Values ) do begin
Carry := Values[ i ];
for j := 0 to High( Dest ) do begin
Inc( Carry, Radix * Dest[ j ] );
Dest[ j ] := Carry and $ff;
Carry := Carry shr 8;
end;
if Carry <> 0 then Exit; // overflow
end;

// We're succesful
Result := True;
end;

{Bytes: array of byte (0..255); Dest: array of Byte(0..Radix-1)}
function DecodeBaseX( const Bytes: array of Byte; var Dest: array of Byte; Radix: Integer ): Boolean;
var
i,j,Carry: Integer;
B: array of Byte;
begin
// We're unsuccesful up to now
Result := False;

// Copy data
if Length( Bytes ) = 0 then Exit;
SetLength( B, Length( Bytes ) );
System.Move( Bytes[ 0 ], B[ 0 ], Length( B ) );

// fill in the details
for i := High( Dest ) downto 0 do begin
Carry := 0;
for j := High( Bytes ) downto 0 do begin
Carry := Carry shl 8 + B[ j ];
B[ j ] := Carry div Radix; Carry := Carry mod Radix;
end;
Dest[ i ] := Carry;
end;

// Check if we collected all the bits
Carry := 0;
for i := 0 to High( B ) do Carry := Carry or B[ i ];

// We're succesful if no bits stayed pending.
Result := ( Carry = 0 );
end;

然后将基数 35 字节转换为字符:

function EncodeKeyToString( const Num128Bits: array of Byte ): Ansistring;
var
Src: array [0..15] of Byte; // your 128 bits
Dest: array [0..24] of Byte;
i: Integer;
const
EncodeTable: AnsiString = '0123456789ABCDEFGHIJKLMNPQRSTUVWXYZ';
// O is not present to make base 35. If you want a different code, be my guest.
begin
// Convert to an array of 25 values between 0-35
System.Move( Num128Bits[ 0 ], Src[ 0 ], Length( Src ) ); // Copy data in our private placeholder
DecodeBaseX( Src, Dest, 35 );

// Convert to a representable string
SetLength( Result, Length( Dest ) );
for i := 0 to High( Dest ) do begin
Assert( Dest[ i ] < Length( EncodeTable ) );
Result[ i + 1 ] := EncodeTable[ 1 + Dest[ i ] ];
end;
end;

我认为你不需要 128 位数学..

祝你好运!

关于delphi - 用delphi进行128位操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7373600/

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