- Este tópico contém 4 respostas, 3 vozes e foi atualizado pela última vez 14 anos, 6 meses atrás por
burga.
-
AutorPosts
-
27 de maio de 2011 às 5:09 am #99408
leandrolbs
ParticipantePessoal, 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 0010nã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.27 de maio de 2011 às 3:45 pm #99413felipeg
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 0010nã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.30 de maio de 2011 às 6:39 pm #99436burga
ParticipanteOi 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,
3 de junho de 2011 às 5:11 pm #99492leandrolbs
ParticipanteBurga, sem duvidas funcionou…
apenas não entendi nada….kkkkkApliquei aqui e 100%;
Tem algum material sobre estes comandos?
3 de junho de 2011 às 8:15 pm #99495burga
ParticipanteVixe… 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…
-
AutorPosts
- Você deve fazer login para responder a este tópico.