ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle unwrapper zt

oracle unwrapper zt

原创 Linux操作系统 作者:zsy0951 时间:2019-05-19 19:48:05 0 删除 编辑

来自itisamos

http://www.itpub.net/viewthread.php?tid=1154232&extra=page%3D1%26amp%3Bfilter%3Ddigest

 

create or replace java source named UNWRAPPER
as
import java.io.*;
import java.util.zip.*;

public class UNWRAPPER
{
  public static String Inflate( byte[] src )
  {
    try
    {
      ByteArrayInputStream bis = new ByteArrayInputStream( src );
      InflaterInputStream iis = new InflaterInputStream( bis );
      StringBuffer sb = new StringBuffer();
      for( int c = iis.read(); c != -1; c = iis.read() )
      {
        sb.append( (char) c );
      }
      return sb.toString();
    } catch ( Exception e )
    {
    }
    return null;
  }
  public static byte[] Deflate( String src, int quality )
  {
    try
    {
      byte[] tmp = new byte[ src.length() + 100 ];
      Deflater defl = new Deflater( quality );
      defl.setInput( src.getBytes( "UTF-8" ) );
      defl.finish();
      int cnt = defl.deflate( tmp );
      byte[] res = new byte[ cnt ];
      for( int i = 0; i < cnt; i++ )
        res = tmp;
      return res;
    } catch ( Exception e )
    {
    }
    return null;
  }
}
/
alter java source UNWRAPPER compile
/

create or replace package amosunwrapper
is
  function deflate( src in varchar2 )
  return raw;
  function deflate( src in varchar2, quality in number )
  return raw;
  function inflate( src in raw )
  return varchar2;
end;
/

create or replace package body amosunwrapper
is
  function deflate( src in varchar2 )
  return raw
  is
  begin
    return deflate( src, 6 );
  end;

  function deflate( src in varchar2, quality in number )
  return raw
  as language java
  name 'UNWRAPPER.Deflate( java.lang.String, int ) return byte[]';

  function inflate( src in raw )
  return varchar2
  as language java
  name 'UNWRAPPER.Inflate( byte[] ) return java.lang.String';

end;
/
CREATE TABLE IDLTRANSLATE
    (
    C_BASE64DECODE  VARCHAR2(2) NOT NULL,
    C_LZDEFLATECODE VARCHAR2(2)     NULL
    )
/

---

 with src AS ( select 'PACKAGE a' txt  from dual   ),
     wrap as   ( select src.txt , dbms_ddl.wrap( 'create ' || src.txt ) wrap  from src  ),
     subst as  (select substr( utl_encode.base64_decode( utl_raw.cast_to_raw(rtrim( substr( wrap.wrap, instr( wrap.wrap, chr( 10 ), 1, 20 ) + 1 ), chr(10) )  ) ), 41 ) x,
         amosunwrapper.deflate( wrap.txt || chr(0), 9 ) d
       from wrap  )
    select substr( x, r * 2 - 1, 2 )  c_base64,
              substr( d, r * 2 - 1, 2 )  c_translatecode
            from subst  , ( select rownum r from dual connect by rownum <= ( select length( x ) / 2 from subst ) );

--

set serveroutput on;
Declare
        vWrappedtext                Varchar2(32767);               
        vChar                                        Varchar2(2);
        vRepchar                                Varchar2(2);
        vLZinflatestr                        Varchar2(32767);
        nLen                Integer;
        nLoop        Integer;
        nCnt                Integer;
type vartab is table of varchar2(2) index by varchar2(2);

mytbl vartab;
cursor getchar is select C_BASE64DECODE xr,C_LZDEFLATECODE dr from sys.idltranslate;
Begin
for i in getchar loop --sys.idltranslate表内容存到字符数组
mytbl(i.xr):=i.dr;
end loop;
        select substr( utl_encode.base64_decode( utl_raw.cast_to_raw(rtrim( substr( TEXT, instr( TEXT, chr( 10 ), 1, 20 ) + 1 ), chr(10) )  ) ), 41 ) x                 
                        Into vWrappedtext
                        from DBA_SOURCE
                        Where wner='SYS'
                        And Name = 'DBMS_OUTPUT'
                        And Type='PACKAGE BODY' ;
        --DBMS_OUTPUT.PUT_LINE(vWrappedtext);
    nLen := Length(vWrappedtext)/2 - 1;

        vLZinflatestr :='';
        For nLoop In 0..nLen Loop
                vChar := Substrb(vWrappedtext,nLoop*2+1,2);
                /*
                Select Count(*) Into nCnt From SYS.IDLTRANSLATE Where C_BASE64DECODE=vChar;
                If nCnt <> 1 Then
                        DBMS_OUTPUT.PUT_LINE('SUBSTATION TABLE WARNING: Count not find following char--'||vChar);
                        Return;
                Else
                        Select C_LZDEFLATECODE Into vRepchar From SYS.IDLTRANSLATE Where C_BASE64DECODE=vChar;
                End If;
                */
                vLZinflatestr := vLZinflatestr || mytbl(vChar); --从字符数组匹配
                --DBMS_OUTPUT.PUT_LINE(vLZinflatestr);
        End Loop;
        --DBMS_OUTPUT.PUT_LINE(vLZinflatestr);
        DBMS_OUTPUT.PUT_LINE(amosunwrapper.inflate(vLZinflatestr));
End;
/

 

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/14740/viewspace-628765/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2002-06-26

  • 博文量
    35
  • 访问量
    35259