delphi中十六进制整型转换成十进制整型的函数
1个回答
展开全部
下面是一个任意制式转换的源码。
const
MinBase = 2;
MaxBase = 36;
function NumToStr (num, len, base: Integer; neg: Boolean;
fill: char): string;
// num = 要转换的数
// len = 生成字符串的最小长度
// base = 进制数 2 = 二进制
// neg = 是否允许负数
// fill = 填充字符用于补满字符串长度//
// 用法:
// NumToStr (45, 8, 2, false, '0') > '00101101'
// NumToStr (45, 4, 8, false, '0') > '0055'
// NumToStr (45, 4, 10, false, ' ') > ' 45'
// NumToStr (45, 4, 16, false, '0') > '002D'
// NumToStr (45, 0, 36, false, ' ') > '19'
var
s: string;
digit: Integer;
begin
num:= ABS (num);
if ((base >= MinBase) and (base <= MaxBase)) then begin
s:= '';
repeat
digit:= num mod base;
if digit < 10 then Insert (CHR (digit + 48), s, 1)
else Insert (CHR (digit + 55), s, 1);
num:= num div base;
until num = 0;
if neg then Insert ('-', s, 1);
while Length(s) < len do Insert (fill, s, 1);
end;
Result:= s;
end;
从字符串转换回数:
function StrToNum (const s: string; base: Integer;
neg: Boolean; max: Integer): Integer;
// s = 要转换的字符串
// base = 进制数
// neg = 是否为负数
// max = 要转换的最大数
// 用法:
// i:= StrToNum ('00101101', 2, false, MaxInt);
// i:= StrToNum ('002D', 16, false, MaxInt);
// i:= StrToNum ('-45', 10, true, MaxInt);
// i:= StrToNum ('ZZ', 36, true, MaxInt);
var
negate, done: Boolean;
i, ind, len, digit, mmb: Integer;
c: Char;
mdb, res: Integer;
begin
res:= 0;
i:= 1;
digit:= 0;
if (base >= MinBase) and (base <= MaxBase) then begin
mmb:= max mod base;
mdb:= max div base;
len:= Length (s);
negate:= False;
while (i <= len) and (s[i] = ' ') do Inc (i);
if neg then begin
case s[i] of
'+': Inc (i);
'-': begin Inc (i); negate:= TRUE; end;
end;
end;
done:= len > i;
while (i <= len) and done do begin
c:= Upcase (s[i]);
case c of
'0'..'9': digit:= ORD(c) - 48;
'A'..'Z': digit:= ORD(c) - 55;
else
done:= FALSE
end;
done:= done and (digit < base);
if done then begin
done:= (res < mdb) or ((res = mdb) and (digit <= mmb));
IF done then begin
res:= res * base + digit;
Inc (i);
end;
end;
end;
if negate then res:= -1 * res;
end;
Result:= res;
end;
const
MinBase = 2;
MaxBase = 36;
function NumToStr (num, len, base: Integer; neg: Boolean;
fill: char): string;
// num = 要转换的数
// len = 生成字符串的最小长度
// base = 进制数 2 = 二进制
// neg = 是否允许负数
// fill = 填充字符用于补满字符串长度//
// 用法:
// NumToStr (45, 8, 2, false, '0') > '00101101'
// NumToStr (45, 4, 8, false, '0') > '0055'
// NumToStr (45, 4, 10, false, ' ') > ' 45'
// NumToStr (45, 4, 16, false, '0') > '002D'
// NumToStr (45, 0, 36, false, ' ') > '19'
var
s: string;
digit: Integer;
begin
num:= ABS (num);
if ((base >= MinBase) and (base <= MaxBase)) then begin
s:= '';
repeat
digit:= num mod base;
if digit < 10 then Insert (CHR (digit + 48), s, 1)
else Insert (CHR (digit + 55), s, 1);
num:= num div base;
until num = 0;
if neg then Insert ('-', s, 1);
while Length(s) < len do Insert (fill, s, 1);
end;
Result:= s;
end;
从字符串转换回数:
function StrToNum (const s: string; base: Integer;
neg: Boolean; max: Integer): Integer;
// s = 要转换的字符串
// base = 进制数
// neg = 是否为负数
// max = 要转换的最大数
// 用法:
// i:= StrToNum ('00101101', 2, false, MaxInt);
// i:= StrToNum ('002D', 16, false, MaxInt);
// i:= StrToNum ('-45', 10, true, MaxInt);
// i:= StrToNum ('ZZ', 36, true, MaxInt);
var
negate, done: Boolean;
i, ind, len, digit, mmb: Integer;
c: Char;
mdb, res: Integer;
begin
res:= 0;
i:= 1;
digit:= 0;
if (base >= MinBase) and (base <= MaxBase) then begin
mmb:= max mod base;
mdb:= max div base;
len:= Length (s);
negate:= False;
while (i <= len) and (s[i] = ' ') do Inc (i);
if neg then begin
case s[i] of
'+': Inc (i);
'-': begin Inc (i); negate:= TRUE; end;
end;
end;
done:= len > i;
while (i <= len) and done do begin
c:= Upcase (s[i]);
case c of
'0'..'9': digit:= ORD(c) - 48;
'A'..'Z': digit:= ORD(c) - 55;
else
done:= FALSE
end;
done:= done and (digit < base);
if done then begin
done:= (res < mdb) or ((res = mdb) and (digit <= mmb));
IF done then begin
res:= res * base + digit;
Inc (i);
end;
end;
end;
if negate then res:= -1 * res;
end;
Result:= res;
end;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询