create or replace function B64toASCII(cadB64 varchar2) return varchar2 is
B64 Varchar2(64):='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
--cadB64 varchar2(100):='dGV4dGFyZWE9Q29tZW50YXJpb3MgZW52aWFkb3MNClN1Ym1pdDQ9QWNlcHRhcg0K';
cadASCII varchar2(4000);
cadASCIITotal varchar2(4000);
contCad integer;
posCaracter integer;
cadBinaria varchar2(6);
cadBinariaOK varchar2(6);
cadBinariaTotal varchar2(4000);
resto integer;
cociente integer;
cont integer;
caracterASCII integer;
caracter varchar2(1);
potencia integer;
numero integer;
begin
--Nos recorremos la cadena en B64
For contCad In 1..Length(cadB64) Loop
--Buscamos la posicion de cada caracter
caracter:=Substr(cadB64,contCad,1);
posCaracter:=Instr(B64,caracter)-1;
cadBinaria:='';
cadBinariaOK:='';
--Si lo encuentro prosigo y si no relleno a ceros cada grupo de 6 bits
if posCaracter>=0 then
--Por cada posicion numerica del caracter B64 encontrado
--obtenemos su codificacion en binario de 6 bits.
cociente:=posCaracter;
resto:=0;
if cociente=1 then
cadBinaria:='1';
end if;
While (cociente>=2) Loop
resto:=mod(cociente,2);
cociente:=trunc(cociente/2);
cadBinaria:=cadBinaria||to_char(resto);
if cociente<2 then
cadBinaria:=cadBinaria||to_char(cociente);
end if;
End Loop;
--Completo la cadena binaria para que tenga 6 bits
cadBinaria:=RPAD(cadBinaria,6,'0');
--Debo invertir posiciones porque esta al reves
For cont In Reverse 1..6 Loop
cadBinariaOK:=cadBinariaOK||substr(cadBinaria,cont,1);
End Loop;
else
--Completo la cadena binaria para que tenga 6 bits
cadBinariaOK:='000000';
end if;
--Acumulamos la representacion binaria de 6 bits de cada
--caracter para obtener agrupaciones de 8 bits mas tarde
cadBinariaTotal:=cadBinariaTotal||cadBinariaOK;
--dbms_output.put_line('Car: '||caracter||' pos: '||to_char(posCaracter+1)||' bin: '||cadBinariaOK);
End Loop;
--Ahora la cadena binaria completa se agrupa en grupos de 8 bits
contCad:=1;
cadASCII:='';
cadASCIITotal:='';
While (contCad<=Length(cadBinariaTotal)) Loop
cadASCII:=Substr(cadBinariaTotal,contCad,8);
caracterASCII:=0;
potencia:=0;
numero:=0;
--dbms_output.put_line('Car: '||cadASCII||' - Cuenta:'||to_char(contCad));
--Convertiremos la cadena de 8 bits binaria a ASCII
For cont In 1..8 Loop
potencia:=8-cont;
numero:=to_number(Substr(cadASCII,cont,1));
caracterASCII:=caracterASCII + numero*(2**potencia);
--dbms_output.put_line(numero||'*2 elevado a '||potencia);
end loop;
contCad:=contCad+8;
cadASCIITotal:=cadASCIITotal||chr(caracterASCII);
end loop;
--dbms_output.put_line('Cadena Base64: '||cadB64);
--dbms_output.put_line('Cadena Binaria: '||cadBinariaTotal);
--dbms_output.put_line('Cadena ASCII: '||cadASCIITotal);
return cadASCIITotal;
exception
WHEN OTHERS THEN
return '';
end;
--select ascii('l') from dual
--select chr(104) from dual
--select trunc(9/2) coc,mod(9,2) resto from dual
/
Comentarios sobre la versión: Versión 1 (0)
No hay comentarios