Delphi--2~36进制的转换

来源:互联网 发布:帝国cms建站系统 编辑:程序博客网 时间:2024/06/06 01:57
这是2到36的任意进制转换的程序代码: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;
0 0
原创粉丝点击