Quando vou ler o número binário de um inputstream aparecem vários números como 67 103 92 58, por estar lendo bytes eu pensei que apareceria só zeros e uns, esse número que aparece é em inteiro, hexadecimal ou o quê? Como interpretar esses números(como transforma-los em zeros e uns)?
vamos la
01010101 em binario
85 em decimal
55 em hexadecimal
todos eles são o mesmo numero. por exemplo vc fazer 85 + 85 é o mesmo que 85 + 0x55.
vc pode representar um numero de varias formas, quando vc lê um byte, vc leu um byte.
acontece que o byte é o um inteiro de 8 bits então quando vc manda imprimir vc vai ver 85 67 103
vc pode formatar esse numero de outras formas. se vc quer imprimir por exemplo
Integer.toString(100,8) // prints 144 --octal representation
Integer.toString(100,2) // prints 1100100 --binary representation
Integer.toString(100,16) //prints 64 --Hex representation
para o que vc quer fazer, talvez esta API seja mais adequada: https://docs.oracle.com/javase/7/docs/api/java/lang/Byte.html
agora se vc quer fazer operações como matematica, vc usa + - / * %
e se vc quer fazer operações bit a bit ( como AND, OR e deslocamento de bits ) vc tem & | << >>
perceba que internamente o numero é representado por 0 e 1. mas um determinado byte pode representar outras coisas ( como um inteiro, um caracter da tabela ascii, etc).
Existe um detalhe que vc tem que pensar que é: java não tem tipos unsigned
portanto pode ser que vc leia um numero como -35 quando na verdade isso é um numero positivo. cuidado
Ah entendi, são números inteiros que representam os bits! Obrigado pela explanação, não entendi, todo número que aparece negativo eu posso entender como o mesmo número só que positivo? Muito obrigado pela resposta, vc é legal!
tudo depende de como é a especificação de inteiro com sinal.
Existem algumas formas, como o complemento de 1 e complemento de 2 ( este ultimo o java utiliza )
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
nesse caso vc tem
#binario signed unsigned 01111111 127 127 10000000 −128 128
assim 11111111 vc vai ver como -1 mas ele pode ser interpretado também como 225
é uma questão de interpretação: 01010101 pode ser um numero, um caracter, uma cor, tudo depende do contexto.
de novo: vc só precisa se preocupar com o sinal em certos casos, bem raros. Por exemplo se vc lê um byte e vc sabe que ele representa uma quantidade unsigned ( ou seja, uma quantidade que pode ser 0 ou positivo ) vc precisa de um certo tratamento ( pois java nao suporta unsigned types ). Um exemplo comum é um protocolo de rede que diga o tamanho do pacote a ser lido e isso nunca sera negativo.
se vc esta lidando com arquivo ASCII puro, vc nunca vai ter esse problema pois ASCII é 7-bit por padrão. se vc esta lidando com um arquivo de imagem, provavelmente vai ter que ler algo como a resolução e a cor de cada pixel, e ai talvez vc precise se preocupar com isso.
portanto é uma questão de contexto vc interpretar corretamente alguns bytes.
Obrigado mesmo, sua explicação deu super certo, estou quase terminando de terminar de programar o compactador, depois disso vou começar a escrever o descompactador e começar a fazer melhorias como threads, interface gráfica etc…