2008-07-22: Ontem conseguimos fazer coisas importantes, como ler a linha de texto e calcular o tamanho do ponteiro. Hoje, continuando, vamos pegar estas informações e devolver ao array de RegistraPonteiro, que possui como atributos, short ponteiro, byte[] conteúdo. Criamos um método chamado writeChanges() que recebe os parâmetros int linha, short ponteiro e String texto. Como cada ponteiro está em uma linha, o parâmetro linha serve como índex do array RegistraPonteiro lista[]. Os outros parâmetros serão os novos valores do ponteiro e seu conteúdo, definidos através dos métodos setPonteiro(short ponteiro) e setConteudo(byte[] conteudo) da Classe RegistraPonteiro.
Para um teste simples, é só retirar o “//DEBUG” e olhar na saída de console o resultado. Desta vez, depois de muito procurar, consegui converter String para bytes de uma forma fácil, através de String.getBytes().
Comentando os teste debugs:
- em Integer.toHexString((int) teste.getPonteiro()));, recebemos o valor short com o método RegistraPonteiro.getPonteiro(), convertemos por cast para int e passamos o resultado como parâmetro de Integer.toHexString() para então obtermos como resultado final o valor em hexadecimal do ponteiro;
- em String hexadecimal = Integer.toHexString(Integer.parseInt(Byte.toString(b[0]))).substring(
Integer.toHexString(Integer.parseInt(Byte.toString(b[0]))).length()-2);, declarei uma String hexadecimal para guarder o valor hexadecimal de um byte. Convertendo um byte para String, temos como resultado Strings de números decimais, então passamos essa String numérica para Inteiro e posteriormente para Hexadecimal. Ainda falta uma coisa. Caracteres que possuem acentos, como os latinos, possuem bytes que se convertem em números hexadecimais muito grandes (na verdade os valores inteiros desses caracteres são negativos, ex, -25 pode ser o ‘é’), e quando vamos passa esses valores hexadecimais para caracteres, aparece ‘?’ no lugar do caractere. O truque foi fazer um substring dos últimos dois caracteres da String hexadecimal. Aí os caracteres com acentos aparecem normalmente quando chamados.
- em int hexa_para_dec = Integer.parseInt(hexadecimal, 16);, fazemos o contrário, passamos de hexadecimal para inteiro. O primeiro parâmetro é a String e o segundo é a base usada na representação.
- em Character.toString((char) hexa_para_dec)); Transformamos uma char em String, lembrando que char é um dado primitivo representado por inteiro, convertendo por cast a representação inteira do hexadecimal para char.
- em lista[linha].setPonteiro(ponteiro);, estamos passando o novo valor do ponteiro de lista[linha].
- em lista[linha].setConteudo(texto.getBytes());, passamos o novo valor do conteúdo de lista[linha].
Ok, fiquem com o código, prometo que vou melhora-lo depois... é que estou muito ansioso por vê-lo funcionando logo...
private void writeChanges( int linha, short ponteiro, String texto){
try {
//DEBUGRegistraPonteiro teste = lista[linha];//só para comparar com o que estava guardado antes...
//DEBUGSystem.out.println("writeChanges(" + linha + ", " + ponteiro + ", " + texto + "): " + Integer.toHexString((int) teste.getPonteiro()));
lista[linha].setPonteiro(ponteiro);
//DEBUGSystem.out.println("writeChanges(" + linha + ", " + ponteiro + ", " + texto + "): " +
//DEBUG Integer.toHexString((int) lista[linha].getPonteiro()) + " - " + Integer.toHexString((int) teste.getPonteiro()));
//Agora tenho que fazer o caminho oposto: Pegar a String e converter num byte array...
lista[linha].setConteudo(texto.getBytes());
/*DEBUGString byte[] b = lista[linha].getConteudo();
//Teste:
hexadecimal = Integer.toHexString(Integer.parseInt(Byte.toString(b[0]))).substring(
Integer.toHexString(Integer.parseInt(Byte.toString(b[0]))).length()-2);
int hexa_para_dec = Integer.parseInt(hexadecimal, 16);
System.out.println("writeChanges(" + linha + ", " + ponteiro + ", " + texto + "): " +
Character.toString((char) hexa_para_dec));*/
} catch (NumberFormatException numberFormatException) {
} catch (NullPointerException npe){
lblTexto.setText("Exceção: NENHUM ARQUIVO ABERTO!");
} catch (ArrayIndexOutOfBoundsException aioobe){
lblTexto.setText("Exceção: FIM DE ARQUIVO!");
}
//lista[linha].setConteudo(Byte.valueOf(texto));
}
Para um teste simples, é só retirar o “//DEBUG” e olhar na saída de console o resultado. Desta vez, depois de muito procurar, consegui converter String para bytes de uma forma fácil, através de String.getBytes().
Comentando os teste debugs:
- em Integer.toHexString((int) teste.getPonteiro()));, recebemos o valor short com o método RegistraPonteiro.getPonteiro(), convertemos por cast para int e passamos o resultado como parâmetro de Integer.toHexString() para então obtermos como resultado final o valor em hexadecimal do ponteiro;
- em String hexadecimal = Integer.toHexString(Integer.parseInt(Byte.toString(b[0]))).substring(
Integer.toHexString(Integer.parseInt(Byte.toString(b[0]))).length()-2);, declarei uma String hexadecimal para guarder o valor hexadecimal de um byte. Convertendo um byte para String, temos como resultado Strings de números decimais, então passamos essa String numérica para Inteiro e posteriormente para Hexadecimal. Ainda falta uma coisa. Caracteres que possuem acentos, como os latinos, possuem bytes que se convertem em números hexadecimais muito grandes (na verdade os valores inteiros desses caracteres são negativos, ex, -25 pode ser o ‘é’), e quando vamos passa esses valores hexadecimais para caracteres, aparece ‘?’ no lugar do caractere. O truque foi fazer um substring dos últimos dois caracteres da String hexadecimal. Aí os caracteres com acentos aparecem normalmente quando chamados.
- em int hexa_para_dec = Integer.parseInt(hexadecimal, 16);, fazemos o contrário, passamos de hexadecimal para inteiro. O primeiro parâmetro é a String e o segundo é a base usada na representação.
- em Character.toString((char) hexa_para_dec)); Transformamos uma char em String, lembrando que char é um dado primitivo representado por inteiro, convertendo por cast a representação inteira do hexadecimal para char.
- em lista[linha].setPonteiro(ponteiro);, estamos passando o novo valor do ponteiro de lista[linha].
- em lista[linha].setConteudo(texto.getBytes());, passamos o novo valor do conteúdo de lista[linha].
Ok, fiquem com o código, prometo que vou melhora-lo depois... é que estou muito ansioso por vê-lo funcionando logo...
private void writeChanges( int linha, short ponteiro, String texto){
try {
//DEBUGRegistraPonteiro teste = lista[linha];//só para comparar com o que estava guardado antes...
//DEBUGSystem.out.println("writeChanges(" + linha + ", " + ponteiro + ", " + texto + "): " + Integer.toHexString((int) teste.getPonteiro()));
lista[linha].setPonteiro(ponteiro);
//DEBUGSystem.out.println("writeChanges(" + linha + ", " + ponteiro + ", " + texto + "): " +
//DEBUG Integer.toHexString((int) lista[linha].getPonteiro()) + " - " + Integer.toHexString((int) teste.getPonteiro()));
//Agora tenho que fazer o caminho oposto: Pegar a String e converter num byte array...
lista[linha].setConteudo(texto.getBytes());
/*DEBUGString byte[] b = lista[linha].getConteudo();
//Teste:
hexadecimal = Integer.toHexString(Integer.parseInt(Byte.toString(b[0]))).substring(
Integer.toHexString(Integer.parseInt(Byte.toString(b[0]))).length()-2);
int hexa_para_dec = Integer.parseInt(hexadecimal, 16);
System.out.println("writeChanges(" + linha + ", " + ponteiro + ", " + texto + "): " +
Character.toString((char) hexa_para_dec));*/
} catch (NumberFormatException numberFormatException) {
} catch (NullPointerException npe){
lblTexto.setText("Exceção: NENHUM ARQUIVO ABERTO!");
} catch (ArrayIndexOutOfBoundsException aioobe){
lblTexto.setText("Exceção: FIM DE ARQUIVO!");
}
//lista[linha].setConteudo(Byte.valueOf(texto));
}
Comentários