Somar bytes

Olá amigos,

Estou com o pequeno problema.
Possuia um código em pascal que realizava uma soma circular entre dois bytes. Limites 1 e 255.

Por exemplo:

250 + 10 = 5
255 + 5 = 5
255 + 10 = 10

Utilizava como simples criptografia. Portei para o Java.
O problema é que com um arquivo de texto, utilizando char, funciona normalmente, mas com arquivos binários não fica legal.

Pude reparar através de alguns testes o seguinte comportamento:

  • Jogo o conteúdo de um arquivo de texto em um byte[]
    ao passar o byte[] para o metodo juntamente com outro byte[] que é a chave, o texto bagunça os acentos.

Na tabela ascii, por exemplo, o ‘á’ é 255.

Mas no java acontece isso:

(byte) ‘á’ = -31
(char) -31 = ‘£’

Tentei delimitar a soma entre 1 e 127, mas alguns caracteres, quando colocados em um byte[], ficam negativos.

Você precisa ler sobre o uso de caracteres em Java. Devido à sua característica multiplataforma, Java representa caracteres na codificação UTF-16. Assim, o tipo char possui 16 bits, e não 8 bits. Ao forçar a conversão char -> byte você passa para o byte somente os 8 primeiros bits do char e nesse processo você perdeu informação. Além do mais, o intervalo de valores do tipo byte é -128 a 127. O único tipo sem sinal é char. Em Java, esqueça ASCII.

Rmendes,

Pesquisei o que você sugeriu, pensei um pouco e resolvi da seguinte maneira:

Criei dois métodos:

private static byte somaByte (byte a, byte b) {

      return (byte) (a + b);

}

private static byte subtraiByte (byte a, byte b) {

      return (byte) (a - b);

}

Desta maneira consegui o resultado desejado. Ele mantém os acentos perfeitamente. Mesmo utilizando um byte[] para armazenar o conteudo do arquivo.

Obrigado.

Um detalhe que eu havia me esquecido de mencionar … qualquer expressão envolvendo tipos inteiros, mesmo que sejam os menores, é convertida automaticamente para int. Por exemplo:

byte a = 10, b = 20;

int c = a + b; //a expressão a + b é do tipo int

byte d = (byte) a + b; //para atribuir a soma para outro byte precisa de coerção explícita

só uma questão sobre o ASCII

acho que se usa ASCII, em java, quando usamos eventos de teclado, por exemplo. já vi e usei programas que usam o enter, o espaço, e outras, através da tabela ASCII

com KeyPressed e coisa parecida.

posso até buscar o método se interessar.

aguardo retorno.