[Delphi] 进制转换之10进制与34进制互转

本文分享了一段实现34进制与十进制相互转换的代码,并提供了使用示例,展示了如何将十进制数转换为34进制字符串,以及如何将34进制字符串转换回十进制数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

嗯,今天阳光明媚,空气清新,心情愉快,还不忙。正好有人说到进制转换,就试着做了一下。

此处省略一千字的废话。。。。

 

34进制,不好优化。要是32进制,除法的地方和乘法地方,应该可以换成移位操作。

 

下面直接上代码,希望大家能看明白。

 

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  Convert: array[0..255] of Integer =
    (
     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
      0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
     -1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
     25,26,27,28,29,30,31,32,33,-1,-1,-1,-1,-1,-1,-1,
     -1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
     25,26,27,28,29,30,31,32,33,-1,-1,-1,-1,-1,-1,-1,
     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
     );
  Convert2: array[0..33] of AnsiChar =
    (
     '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f',
     'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
     'w','x');


function IntToHEX34(const V: Int64; const Digits: Integer = -1): string;
const
  CSTR = '0000000000000000';
var
  P, P1: PAnsiChar;
  I: Int64;
  NewLen: Integer;
begin
  GetMem(P, 16);
  Move(CSTR, P^, 16);
  P1 := P + 16 - 1;
  I := V;
  while True do begin
    P1^ := Convert2[I mod 34];
    I := I div 34;
    if I = 0 then
      Break
    else
      Dec(P1);
  end;
  NewLen := 16 - (P1 - P);
  if NewLen > Digits then
    SetString(Result, P1, NewLen)
  else begin
    P1 := P + 16 - Digits;
    SetString(Result, P1, Digits);
  end;
end;

function HEX34ToInt(const S: string; const Default: Int64): Int64;
var
  I: Integer;
  v: Int64;
begin
  Result := 0;
  for I := 1 to length(s) do
  begin
    V := Convert[ord(s[i])];
    if V < 0 then begin
      Result := Default;
      Exit;
    end;
    result := (result * 34) + V;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit2.Text := IntToHEX34(StrToInt64Def(Edit1.Text, 0));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Edit1.Text := IntToStr(HEX34ToInt(Edit2.Text, 0));
end;

end.

 

效果图:

 

 

转载于:https://www.cnblogs.com/yangyxd/articles/5146717.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值