Преобразовать массив из 0 и 1 в строку base36 - PullRequest
3 голосов
/ 12 мая 2010

Вот эта вещь. У меня есть массив 0 и 1. Он должен быть двоичной строкой. Что мне нужно, это отформатировать его в строку, содержащую преобразование base36 из этого двоичного файла. Другими словами, мне нужно сделать это: массив из 1 и 0 -> какое-то двоичное число -> преобразовать в число base36 -> поместить его в строку. Как это сделать?

Тысячи нефти, 300 стали и +1 удача ответчикам.

1 Ответ

1 голос
/ 12 мая 2010

Нет встроенного Oracle для такого преобразования. В следующем примере я использую две функции, подтвержденные бесценным мистером Кайтом . to_dec() превращает другие основания в десятичные, а to_base() превращает десятичные в другие.

Процедура принимает массив единиц и нулей и возвращает строку с базой 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

Если вы счастливы играть с небольшой неточностью, вы можете заменить переменные NUMBER переменными BINARY_DOUBLE (как в моем примере, так и в функциях Тома). Этот тип данных может обрабатывать гораздо большие числа. Я провернул его до array_count=470, что может выглядеть следующим образом в базе 36:

EKQA1EJ6QB4SC8WOOWKWGGOS4KWWWWCS4WCW4SCWCOSOOS888K4CSC8SWO8OCKC8SSCWCOGK844CKG00SOW8KGS0CC4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...