2010-05-12 6 views
3

Voici la chose. J'ai un tableau de 0 et 1. Il est censé être une chaîne binaire. Ce dont j'ai besoin, c'est de le formater en une chaîne contenant la conversion base36 de ce binaire. En d'autres termes, j'ai besoin de faire ceci: tableau de 1 et 0 -> une sorte de nombre binaire -> convertir en nombre base36 -> le mettre en chaîne. Comment faire cela?Convertir le tableau de 0 et 1 en base36 string

Des milliers d'huile, 300 acier et +1 chance aux répondeurs.

+1

base de données = 11g oracle, btw – foret

+3

Je ne reçois pas l'offre de primes. Est-ce une référence de la culture pop? – MJB

+0

Quelle est la longueur du tableau? Sera-t-il compatible avec un type Oracle NUMBER (38 chiffres)? –

Répondre

1

Oracle n'est pas intégré pour effectuer ce type de conversion. Dans l'exemple suivant, j'utilise deux fonctions avec the inestimable Mr Kyte. to_dec() transforme les autres bases en décimales et to_base() transforme les décimales en autres bases.

La procédure prend un tableau de zéros et les uns et retourne une chaîne de la 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; 
/

La preuve du pudding, et tout ce qui ...

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> 

modifier

Pendant que j'assemblais cet exemple, vous avez indiqué que votre tableau de zéros était long d'environ 450 entrées. Cette routine ne va pas gérer quelque chose comme ça. Il lancera ORA-01426: numeric overflow avant que vous atteigniez un nombre de cette taille.

modifier 2

Si vous êtes heureux de jouer avec un peu d'imprécision, vous pouvez remplacer les variables NUMÉRIQUES avec des variables BINARY_DOUBLE (dans les deux mon échantillon et les fonctions de Tom). Ce type de données peut gérer des nombres beaucoup plus importants. Je coudés jusqu'à ce array_count=470, ce qui pourrait ressembler à ceci dans la base 36:

EKQA1EJ6QB4SC8WOOWKWGGOS4KWWWWCS4WCW4SCWCOSOOS888K4CSC8SWO8OCKC8SSCWCOGK844CKG00SOW8KGS0CC4 
+0

Juste une question sur le commentaire ci-dessus: Je suis d'accord que 10001110 (base 2) = 142 (base 10), mais je crois que 142 (base 10) = 3Y (base 36). Ou peut-être que je ne comprends pas ce que "5YCWM" signifie dans ce cas. –

+0

@BobJarvis - bonne prise! J'avais collé une version antérieure de mon exemple de code au lieu de l'extrait de SQL * PLus que je voulais publier. Maintenant corrigé. – APC

+0

Merci, c'était vraiment utile. – foret

Questions connexes