這是事情。我有一個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