Código de Oracle - Convertir de Base64 a ASCII

sin imagen de perfil

Convertir de Base64 a ASCIIgráfica de visualizaciones


Oracle

Publicado el 27 de Octubre del 2008 por Alain Simonet Varona
9.713 visualizaciones desde el 27 de Octubre del 2008
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
9.714 visualizaciones desde el 27 de Octubre del 2008
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...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s1721