这是事情。我有一个0和1的数组。它应该是一个二进制字符串。我需要的是将其格式化为包含来自该二进制文件的base36转换的字符串。 换句话说,我需要这样做:1和0的数组 - >某种二进制数 - >转换为base36数字 - >将其放入字符串中。 如何做到这一点?将0和1的数组转换为base36字符串
成千上万的石油,300钢和回答者+1。
这是事情。我有一个0和1的数组。它应该是一个二进制字符串。我需要的是将其格式化为包含来自该二进制文件的base36转换的字符串。 换句话说,我需要这样做:1和0的数组 - >某种二进制数 - >转换为base36数字 - >将其放入字符串中。 如何做到这一点?将0和1的数组转换为base36字符串
成千上万的石油,300钢和回答者+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
数据库为oracle 11g中,顺便说一句 – foret 2010-05-12 13:19:38
我没有得到赏金的报价。这是一个流行文化的参考? – MJB 2010-05-12 13:21:23
阵列有多长?它是否适合Oracle NUMBER类型(38位数字)? – 2010-05-12 13:31:52