2010-05-12 47 views
3

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

成千上万的石油,300钢和回答者+1。

+1

数据库为oracle 11g中,顺便说一句 – foret 2010-05-12 13:19:38

+3

我没有得到赏金的报价。这是一个流行文化的参考? – MJB 2010-05-12 13:21:23

+0

阵列有多长?它是否适合Oracle NUMBER类型(38位数字)? – 2010-05-12 13:31:52

回答

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的变量数变量(我的两个样本中和汤姆的功能)。该数据类型可以处理更多的数字。我手摇它到array_count=470,这可能是这样的基地36:

EKQA1EJ6QB4SC8WOOWKWGGOS4KWWWWCS4WCW4SCWCOSOOS888K4CSC8SWO8OCKC8SSCWCOGK844CKG00SOW8KGS0CC4 
+0

只是一个关于上述评论的问题:我会同意10001110(基数2)= 142(基数10),但我相信142(基数10)= 3Y(基数36)。或者也许我不明白在这种情况下“5YCWM”是什么意思。 – 2010-05-12 14:46:17

+0

@BobJarvis - 赶上!我粘贴了我的示例代码的早期版本,而不是来自SQL * PLus的片段,我打算发布这些片段。现在纠正了。 – APC 2010-05-12 14:59:51

+0

谢谢,这真的很有帮助。 – foret 2010-05-12 15:07:48

相关问题