📄 chb.m
字号:
function B = chb(A,a,b)
% B = chb(A,a,b) change numerical base:
% a,b scalars from 2 to 64 , A,B strings.
% Number A in base a , expressed in base b by B.
% Symbols are 0 .. 9 A .. Z a .. z @ &.
%
% Example:
% '-54.13'-chb(chb('-54.13',6,27),27,6)
%
% Giampiero Campa 21-2-94
B=[];
l=length(A);
v=0;
c=0;
d=0;
y=0;
if l==0, error('A is unexisting')
end
if ~isstr(A)|l==0|A=='-', error('A must be a string')
elseif (a > 64)|(b > 64)|(a < 2)|(b < 2), error('invalid base')
end
if A(1)=='-',
s='-';
l=l-1;
A=A(2:l+1);
else s='';
end
for i = 1:l,
if (A(i)=='&' & a<64)|(A(i)=='@' & a<63), error('invalid base or symbol')
elseif (A(i)~='&' & A(i)~='@'),
if A(i)<'.'|A(i)=='/'|A(i)>'z'|...
(A(i)>'9' & A(i)<'A')|(A(i)>'Z' & A(i)<'a'), error('invalid base or symbol')
end
end
if (abs(A(i)) > a+60)|(abs(A(i))>a+54 & a<37)|(abs(A(i))>a+47 & a<11)|(A(i)=='.' & v>0),
error('invalid base or symbol')
elseif A(i)=='.', v=i;
end
end
if v==0, v=l+1;
end
for i=1:v-1;
if A(i)<':', y=A(i)-'0';
elseif A(i)<'[', y=A(i)-55;
else y=A(i)-61;
end
if A(i)=='@', y=62;
elseif A(i)=='&', y=63;
end
c=c+y*a^(v-1-i);
end
for i=v+1:l;
if A(i)<':', y=A(i)-'0';
elseif A(i)<'[', y=A(i)-55;
else y=A(i)-61;
end
if A(i)=='@', y=62;
elseif A(i)=='&', y=63;
end
d=d+y*a^(v-i);
end
while c>0,
z=round(b*(c/b-fix(c/b)));
c=fix(c/b);
if z<10, q=setstr(48+z);
elseif z<36, q=setstr(55+z);
else q=setstr(61+z);
end
if z=='62', q='@';
elseif z>='63', q='&';
end
B=[q,B];
end
B=[s,B];
if d>0,
B=[B,'.'];
for i=1:38;
z=fix(d*b);
d=d*b-z;
if z==b,
d=1-1e-10;
z=b-1;
end
if z<10, q=setstr(48+z);
elseif z<36, q=setstr(55+z);
else q=setstr(61+z);
end
if z=='62', q='@';
elseif z>='63', q='&';
end
B=[B,q];
end
while B(length(B))=='0',
B=B(1:length(B)-1);
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -