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
| DECLARE
v_retour VARCHAR2(4000);
v_chaine VARCHAR2(2000) := 'any carnal pleasure'; --' is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.';
v_b64 VARCHAR2(24); -- binaire de 3 char => 4 car 64
len NUMBER;
j NUMBER;
v_bin VARCHAR2(6);
-- fonction decimal en binaire
FUNCTION dec2bin (N IN number) RETURN varchar2 IS
binval varchar2(64);
N2 number := N;
BEGIN
WHILE N2 > 0
LOOP
binval := MOD(N2, 2) || binval;
N2 := TRUNC( N2 / 2 );
END LOOP;
RETURN binval;
END dec2bin;
FUNCTION bin2dec (binval IN char) RETURN number IS
result number := 0;
current_digit char(1);
current_digit_dec number;
BEGIN
FOR i IN 1..LENGTH(binval) LOOP
current_digit := SUBSTR(binval, i, 1);
current_digit_dec := TO_NUMBER(current_digit);
result := (result * 2) + current_digit_dec;
END LOOP;
RETURN result;
END bin2dec;
FUNCTION car64(p_num IN number) RETURN varchar2
IS
BEGIN
-- Renvoit A-Z
IF p_num BETWEEN 0 AND 25 THEN RETURN CHR(65 + p_num); END IF;
-- a-z
IF p_num <= 51 THEN RETURN CHR(71 + p_num); END IF;
-- 0-9
IF p_num <= 61 THEN RETURN CHR(-4 + p_num); END IF;
IF p_num = 62 THEN RETURN '+'; END IF;
IF p_num = 63 THEN RETURN '/'; END IF;
RAISE_APPLICATION_ERROR(-20001, 'Pb num appel car64 :'|| p_num);
END;
--
BEGIN
--
len := LENGTH(v_chaine);
-- On boucle par 3 car qui seront transformés en 4
FOR i IN 1 .. CEIL(len/3)
LOOP
v_b64 := LPAD(dec2bin(ASCII(SUBSTR(v_chaine, 3*(i-1)+1, 1))),8,'0');
-- si le car suivant existe
IF 3*(i-1)+2 <= len
THEN
v_b64 := v_b64 || LPAD(dec2bin(ASCII(SUBSTR(v_chaine, 3*(i-1)+2, 1))),8,'0');
-- si le car suivant existe
IF 3*(i-1)+3 <= len
THEN
v_b64 := v_b64 || LPAD(dec2bin(ASCII(SUBSTR(v_chaine, 3*(i-1)+3, 1))),8,'0');
ELSE
-- On rajoute des '0' pour arriver à 18 bits (3 car 64)
v_b64 := RPAD(v_b64, 18, '0');
END IF;
ELSE
-- On rajoute des '0' pour arriver à 12 bits (2 car 64)
v_b64 := RPAD(v_b64, 12, '0');
END IF;
-- DBMS_OUTPUT.put_line(v_b64);
-- On crée les caractères en B64 (codés sur 6 bits)
-- On lit par 6 bits x 4
FOR i IN 0..3
LOOP
v_bin := SUBSTR(v_b64, 6*i+1, 6);
-- DBMS_OUTPUT.put_line(i||':'||v_bin ||':'|| bin2dec(v_bin));
IF v_bin IS NOT NULL
THEN
v_retour := v_retour || car64(bin2dec(v_bin));
ELSE
v_retour := v_retour || LPAD('=', 4-i, '=');
EXIT;
END IF;
END LOOP;
END LOOP;
DBMS_OUTPUT.put_line(v_retour);
END; |
Partager