[code] /*
encode
transforma uma string caracteres em uma string hexadecimal
*/
public static oracle.sql.CHAR encode(String param) throws java.sql.SQLException{
String result = “”;
for(int i=0; i<param.length(); i++) {
result += Integer.toHexString(param.charAt(i));
}
oracle.sql.CHAR rs = new oracle.sql.CHAR(result.toString(), oracle.sql.CHAR.DEFAULT_CHARSET );
return(rs);
}
[/code]
esse código funciona belezinha a não ser que o parametro seja nulo ou vazio…
alguem ai tem alguma dica?
testes com IF não foram muito bem sucedidos…
hehe
ps: isso é JavaStoredProcedures
- Porque é que você chama o toString de uma String? (Na prática não muda nada, mas é só pra aporrinhar mesmo). Do jeito que você escreveu o código aquele pessoal fanático por “performance” pediria para corrigir para:
StringBuffer result = new StringBuffer();
if (param != null) {
for(int i=0; i<param.length(); i++) {
result.append (Integer.toHexString(param.charAt(i)));
}
}
- O seu IF não é só pra pôr fora do “for” para evitar dar um NullPointerException em param.length()?
- Você teve sorte porque na sua string não tem nenhum caracter como “\n” cuja representação é “A” e não “0A” pela rotina que você escreveu. Se entrasse algum caracter desses (que tem apenas 1 dígito) você ia ter problemas na hora de recuperar a string original.
>
então deixa eu sugar um pouco mais de teoria…
se uma string for nula… eu não vou então conseguir usar o string.length()???
e esse stringBuffer realmente rende tanto assim?
evita coisas do tipo estouro de variável?
e,
valeu…
hehe
[quote=proteus_adi]então deixa eu sugar um pouco mais de teoria…
se uma string for nula… eu não vou então conseguir usar o string.length()???[/quote]
nao… vc nao pode chamar metodos em cima de uma referencia pra null
rende se vc usar 1 zilhao de concatenacoes…
pras coisas gerais do dia a dia, use concatenacao de Strings mesmo que rende muito mais em clareza de codigo
E agora tem o StringBuilder tbm no java 5 q eh divertido
hein?!
eu não entendi da primeira vez…
o que vc quer dizer com isso?
essa rotina não funciona pra qqer string???
Vamos por partes.
Integer.toHexString(int) lhe volta uma string hexadecimal, sem zeros à esquerda. Assim: Integer.toHexString (’ ‘) lhe retorna “20”, que é o código hexadecimal do espaço.
Suponha que sua string tivesse algum caracter como um ENTER ("\n", ou 0x0A). Isso não é incomum mas não sei se você quer isso mesmo ou não. O que vai ocorrer é que Integer.toHexString(’\n’) vai lhe retornar “A”, não “0A”.
Como o Oracle quer a string hexadecimal com 2 dígitos para cada caracter, a partir desse caracter as coisas vão ficar fora de sincronia.
deixa eu ver então se eu entendi…
eu tenho que fazer uma implementação do tipo…
se tamanho retorno menor que dois adiciona um 0???
eu tive mesmo problemas com enters e tabs…
eu uso um replace antes de rodar isso…
rs**
e tiro os espaços excessivos tambem…
mas a solução seria isso?
ou seria melhor uma tabela?
Tem dois jeitos.
Um deles é fazer na unha - se procurar tem um monte de gente que faz assim. (Com tabela 0,1,2,3…A,B,C,D,E,F). Não é difícil mas tem de tomar cuidado.
Outro é usar um truque sujo, que pelo visto é usado por um monte de gente (outro dia tinha visto no forum.java.sun.com um cara usando isso.)
Digamos que você tenha um caracter 0x0A.
O que ocorre quando você faz um OR (|) desse valor com 0x100? Vai ficar como 0x10A, e na hora que você for achar Integer.toHexString, vai valer 10A. Aí o que eu faço é pegar do 2o. caracter em diante.
Resumindo:
Integer.toHexString (((param.charAt(i) & 0xFF) | 0x100).substring(1);
(O outro truque é usar & 0xFF, que deixa o valor no intervalo entre 00 e FF. S por acaso você tiver um caracter cujo código Unicode passar de 0xFF, ele vai ser podado, mas em português são raros esses caracteres.)