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
| FUNCTION DECODE_64(p_chaine IN VARCHAR2) RETURN RAW IS
i PLS_INTEGER;
x PLS_INTEGER;
y PLS_INTEGER;
v RAW(32767);
pos_egal NUMBER;
r VARCHAR2(32767) := p_chaine;
len NUMBER;
BEGIN
-- For every 4 bytes, split them into 3 8-bit units and map them to Ascii characters
i := 1;
r := REPLACE(REPLACE(p_chaine, CHR(13)), CHR(10));
len := LENGTH(r);
pos_egal := INSTR(r, '=');
WHILE ( i <= len )
LOOP
x := unmap(ASCII(SUBSTR(r, i, 1))) * 262144
+ unmap(ASCII(SUBSTR(r, i + 1, 1))) * 4096
+ unmap(ASCII(SUBSTR(r, i + 2, 1))) * 64
+ unmap(ASCII(SUBSTR(r, i + 3, 1)));
IF pos_egal NOT BETWEEN i AND i + 3
THEN
v := UTL_RAW.CONCAT(v, UTL_RAW.SUBSTR(UTL_RAW.cast_from_binary_integer(x),2));
ELSIF pos_egal = i + 2
THEN
v := UTL_RAW.CONCAT(v, UTL_RAW.SUBSTR(UTL_RAW.cast_from_binary_integer(x),2, 1));
ELSIF pos_egal = i + 3
THEN
v := UTL_RAW.CONCAT(v, UTL_RAW.SUBSTR(UTL_RAW.cast_from_binary_integer(x),2, 2));
END IF;
i := i + 4;
END LOOP;
RETURN v;
END; |