Pular para o conteúdo
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #99408
    leandrolbs
    Participante

      Pessoal, seguinte:

      Estou desenvolvendo um function que ira gerar um criptografia CBC.

      em determinado ponto, preciso de converter o char em binario. ex:

      a = 0110 0001
      b = 0110 0010

      não achei a função do Oracle que convert essas informações, então apelei para um tabela ascii dentro do meu banco…rs

      INSERT INTO CONV_ASCII (CHARS,DEC,HEX,BIN) VALUES ('a', '97', '61' , '0110 0001');
      INSERT INTO CONV_ASCII (CHARS,DEC,HEX,BIN) VALUES ('b', '98', '62' , '0110 0010');
      INSERT INTO CONV_ASCII (CHARS,DEC,HEX,BIN) VALUES ('c', '99', '63' , '0110 0011');
      INSERT INTO CONV_ASCII (CHARS,DEC,HEX,BIN) VALUES ('d' , '100' , '64' , '0110 0100');
      INSERT INTO CONV_ASCII (CHARS,DEC,HEX,BIN) VALUES ('e' , '101' , '65' , '0110 0101');
      INSERT INTO CONV_ASCII (CHARS,DEC,HEX,BIN) VALUES ('f' , '102' , '66' , '0110 0110');
      INSERT INTO CONV_ASCII (CHARS,DEC,HEX,BIN) VALUES ('g' , '103' , '67' , '0110 0111');
      INSERT INTO CONV_ASCII (CHARS,DEC,HEX,BIN) VALUES ('h' , '104' , '68' , '0110 1000');

      Até então, foi essa a opção. Algum sujestão ? existe uma função de str to bin em PLSQL ?
      obrigado.

      #99413
      felipeg
      Participante

        [quote=”leandrolbs”:1awdbi4k]Pessoal, seguinte:

        Estou desenvolvendo um function que ira gerar um criptografia CBC.

        em determinado ponto, preciso de converter o char em binario. ex:

        a = 0110 0001
        b = 0110 0010

        não achei a função do Oracle que convert essas informações, então apelei para um tabela ascii dentro do meu banco…rs

        INSERT INTO CONV_ASCII (CHARS,DEC,HEX,BIN) VALUES ('a', '97', '61' , '0110 0001');
        INSERT INTO CONV_ASCII (CHARS,DEC,HEX,BIN) VALUES ('b', '98', '62' , '0110 0010');
        INSERT INTO CONV_ASCII (CHARS,DEC,HEX,BIN) VALUES ('c', '99', '63' , '0110 0011');
        INSERT INTO CONV_ASCII (CHARS,DEC,HEX,BIN) VALUES ('d' , '100' , '64' , '0110 0100');
        INSERT INTO CONV_ASCII (CHARS,DEC,HEX,BIN) VALUES ('e' , '101' , '65' , '0110 0101');
        INSERT INTO CONV_ASCII (CHARS,DEC,HEX,BIN) VALUES ('f' , '102' , '66' , '0110 0110');
        INSERT INTO CONV_ASCII (CHARS,DEC,HEX,BIN) VALUES ('g' , '103' , '67' , '0110 0111');
        INSERT INTO CONV_ASCII (CHARS,DEC,HEX,BIN) VALUES ('h' , '104' , '68' , '0110 1000');

        Até então, foi essa a opção. Algum sujestão ? existe uma função de str to bin em PLSQL ?
        obrigado.[/quote]

        Leandro, bom dia

        Após ver o seu post fiquei curioso e resolvi verificar também.

        Aparentemente não tem, PL/SQL, uma função para converter diretamente para binário (em MSSQL tem hehe).

        A única solução foi essa que você já apresentou.

        Atenciosamente,
        Felipe.

        #99436
        burga
        Participante

          Oi Leandro,

          Achei que dava pra fazer com a cláusula MODEL, fui brincar e cheguei a uma resposta, espero que entenda e que minha resposta ajude… Não fiz todos os testes mas me parece que está correto:

          WITH tab_texto AS (
          SELECT 'aa' AS texto FROM dual
          UNION ALL
          SELECT 'ab' AS texto FROM dual
          )
          SELECT LPAD(texto2, 8*CEIL(LENGTH(texto2)/8),'0')
          FROM (SELECT texto, ROWNUM AS y FROM tab_texto)
          MODEL
          PARTITION BY (y)
          DIMENSION BY (1 as x)
          MEASURES (UTL_RAW.CAST_TO_BINARY_INTEGER(UTL_RAW.CAST_TO_RAW(texto)) num,
          CAST(NULL AS VARCHAR2(4000)) AS texto2)
          RULES ITERATE (100000) UNTIL (num[1] <= 0)
          ( texto2[1] = MOD(num[1],2) || texto2[1],
          num[1] = FLOOR(num[1] / 2)
          );

          Abraços,

          #99492
          leandrolbs
          Participante

            Burga, sem duvidas funcionou…
            apenas não entendi nada….kkkkk

            Apliquei aqui e 100%;

            Tem algum material sobre estes comandos?

            #99495
            burga
            Participante

              Vixe… Se procurar no google MODEL CLAUSE ORACLE você encontra bastante coisa… Mas basicamente o que a consulta faz é transformar o texto em um número inteiro
              UTL_RAW.CAST_TO_BINARY_INTEGER(UTL_RAW.CAST_TO_RAW(texto))

              E a partir daí ir dividindo por dois e pegando o resto da divisão pra formar a representação em binário… Então toda a lógica da transformação está aqui:
              RULES ITERATE (100000) UNTIL (num[1] <= 0)
              ( texto2[1] = MOD(num[1],2) || texto2[1],
              num[1] = FLOOR(num[1] / 2)
              );

              É como se fosse um WHILE ou FOR LOOP dentro de uma instrução SQL. A única restrição é o tamanho final da string que não pode ultrapassar 4000 caracteres/bytes. Então o tamanho máximo do texto a ser convertido não pode ultrapassar 500 caracteres…

              Mas só uma coisa… Se você está tentando gerar uma função que criptografe esse texto e não quer usar o DBMS_CRYPTO ou o DBMS_OBFUSCATION_TOOLKIT, provavelmente você quer fazer um XOR entre os bits do seu texto e da chave. Se for isso mesmo, você pode usar direto a função UTL_RAW.BIT_XOR…

            Visualizando 5 posts - 1 até 5 (de 5 do total)
            • Você deve fazer login para responder a este tópico.