Lendo bytes de um inputstream, o número que aparece está em HEX?

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…