DBA Data[Home] [Help]

PACKAGE BODY: APPS.OKS_BASE64

Source


1 PACKAGE BODY OKS_BASE64 AS
2 /* $Header: OKSBASEB.pls 120.0 2005/05/25 18:01:54 appldev noship $ */
3 
4    TYPE vc2_table IS TABLE OF VARCHAR2(1) INDEX BY BINARY_INTEGER;
5    map vc2_table;
6 
7    -- Initialize the Base64 mapping
8    PROCEDURE init_map IS
9    BEGIN
10       map(0) :='A'; map(1) :='B'; map(2) :='C'; map(3) :='D'; map(4) :='E';
11       map(5) :='F'; map(6) :='G'; map(7) :='H'; map(8) :='I'; map(9):='J';
12       map(10):='K'; map(11):='L'; map(12):='M'; map(13):='N'; map(14):='O';
13       map(15):='P'; map(16):='Q'; map(17):='R'; map(18):='S'; map(19):='T';
14       map(20):='U'; map(21):='V'; map(22):='W'; map(23):='X'; map(24):='Y';
15       map(25):='Z'; map(26):='a'; map(27):='b'; map(28):='c'; map(29):='d';
16       map(30):='e'; map(31):='f'; map(32):='g'; map(33):='h'; map(34):='i';
17       map(35):='j'; map(36):='k'; map(37):='l'; map(38):='m'; map(39):='n';
18       map(40):='o'; map(41):='p'; map(42):='q'; map(43):='r'; map(44):='s';
19       map(45):='t'; map(46):='u'; map(47):='v'; map(48):='w'; map(49):='x';
20       map(50):='y'; map(51):='z'; map(52):='0'; map(53):='1'; map(54):='2';
21       map(55):='3'; map(56):='4'; map(57):='5'; map(58):='6'; map(59):='7';
22       map(60):='8'; map(61):='9'; map(62):='+'; map(63):='/';
23    END;
24 
25    FUNCTION encode(r IN RAW) RETURN VARCHAR2 IS
26      i pls_integer;
27      x pls_integer;
28      y pls_integer;
29      v VARCHAR2(32767);
30    BEGIN
31 
32       -- For every 3 bytes, split them into 4 6-bit units and map them to
33       -- the Base64 characters
34       i := 1;
35       WHILE ( i + 2 <= utl_raw.length(r) ) LOOP
36          x := to_number(utl_raw.substr(r, i, 1), '0X') * 65536 +
37               to_number(utl_raw.substr(r, i + 1, 1), '0X') * 256 +
38               to_number(utl_raw.substr(r, i + 2, 1), '0X');
39          y := floor(x / 262144); v := v || map(y); x := x - y * 262144;
40          y := floor(x / 4096);   v := v || map(y); x := x - y * 4096;
41          y := floor(x / 64);     v := v || map(y); x := x - y * 64;
42                                  v := v || map(x);
43          i := i + 3;
44       END LOOP;
45 
46       -- Process the remaining bytes that has fewer than 3 bytes.
47       IF ( utl_raw.length(r) - i = 0) THEN
48          x := to_number(utl_raw.substr(r, i, 1), '0X');
49          y := floor(x / 4);      v := v || map(y); x := x - y * 4;
50          x := x * 16;            v := v || map(x);
51          v := v || '==';
52       ELSIF ( utl_raw.length(r) - i = 1) THEN
53          x := to_number(utl_raw.substr(r, i, 1), '0X') * 256 +
54               to_number(utl_raw.substr(r, i + 1, 1), '0X');
55          y := floor(x / 1024);   v := v || map(y); x := x - y * 1024;
56          y := floor(x / 16);     v := v || map(y); x := x - y * 16;
57          x := x * 4;             v := v || map(x);
58          v := v || '=';
59       END IF;
60 
61       RETURN v;
62 
63    END;
64 
65 BEGIN
66    init_map;
67 END;