Código de Oracle - Convertir de Base64 a ASCII

<<>>

Convertir de Base64 a ASCIIgráfica de visualizaciones


Oracle

Publicado el 27 de Octubre del 2008 por Alain Simonet Varona
7.734 visualizaciones desde el 27 de Octubre del 2008. Una media de 21 por semana
Función hecha para ORACLE para convertir de Base64 a ASCII. La necesite para poder recibir correo desde ORACLE y mirar el contenido de los
ficheros adjuntos, que están codificados en Base64.
create or replace function B64toASCII(cadB64 varchar2) return varchar2 is B64

Versión 1

Publicado el 27 de Octubre del 2008gráfica de visualizaciones de la versión: Versión 1
7.735 visualizaciones desde el 27 de Octubre del 2008. Una media de 21 por semana
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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
 

Comentar la versión: Versión 1

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios

http://lwp-l.com/s1721