任意进制之间的转换

字体大小: 中小 标准 ->行高大小: 标准
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; (* CASE *) 
  end; (* IF neg *) 
  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; (* CASE *) 
   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; (* IF done *) 
   end; (* IF done *) 
  end; (* WHILE *) 
  if negate then res:= - res; 
end; (* IF done *) 
Result:= res; 
end; 

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/67935.html