将0和1的数组转换为base36字符串

时间:2010-05-12 13:18:56

标签: oracle plsql

这是事情。我有一个0和1的数组。它应该是一个二进制字符串。我需要的是将其格式化为包含来自该二进制文件的base36转换的字符串。 换句话说,我需要这样做:1和0的数组 - >某种二进制数 - >转换为base36数字 - >把它放进字符串。 怎么做?

成千上万的石油,300钢和回复运气+1。

1 个答案:

答案 0 :(得分:1)

没有内置Oracle来进行此类转换。在下面的示例中,我使用the inestimable Mr Kyte所示的两个函数。 to_dec()将其他基数转换为小数,to_base()将小数转换为其他基数。

该过程采用一个1和0的数组,并返回一个基数为36的字符串。

create or replace type binary_nt as table of number(1,0);
/

create or replace function base2_to_base36 
    (p_onesnzeroes in binary_nt)
    return varchar2
is
    s_b2 varchar2(38);
    n_b10 pls_integer;
    s_b36 varchar2(38);
begin
    for i in 1..p_onesnzeroes.count()
    loop
        s_b2 := s_b2||trim(to_char(p_onesnzeroes(i)));
    end loop;

    n_b10 := to_dec(s_b2, 2);
    s_b36 := to_base(n_b10, 36);

    return s_b36;
end;
/

布丁的证明以及所有......

SQL> set serveroutput on size unlimited
SQL>     declare
  2          bins binary_nt := binary_nt(1,0,0,0,1,1,1,0);
  3          s varchar2(128);
  4      begin
  5          --  10001110 => 142  => 3Y
  6          s :=  base2_to_base36(bins);
  7          dbms_output.put_line(s);
  8      end;
  9      /
3Y

PL/SQL procedure successfully completed.

SQL>

修改

当我组装这个样本时,你发布了你的零数组是大约450个条目。这个例程不会处理这样的事情。在你达到那么大的数量之前,它会以ORA-01426: numeric overflow的方式投掷。

编辑2

如果您愿意稍微不精确地赌博,可以用BINARY_DOUBLE变量替换NUMBER变量(在我的示例和Tom的函数中)。该数据类型可以处理更大的数字。我把它调到array_count=470,在36号基地看起来像这样:

EKQA1EJ6QB4SC8WOOWKWGGOS4KWWWWCS4WCW4SCWCOSOOS888K4CSC8SWO8OCKC8SSCWCOGK844CKG00SOW8KGS0CC4