本文整理自网络,侵删。
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.
34进制,不好优化。要是32进制,除法的地方和乘法地方,应该可以换成移位操作。
来源:http://blog.qdac.cc/?p=3405
相关阅读 >>
Delphi firemonkey处理图形的方式与vcl处理图形的方式大不相同
Delphi 泛型容器单元(generics.collections) tdictionary<t>
Delphi中break,exit,abort跳出循环的比较
Delphi tstylemanager读取vsf皮肤文件信息
Delphi vcl 的 tpagecontrol 控件,实现对页签的拖动
更多相关阅读请进入《Delphi》频道 >>