2010-05-12 94 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