Fluxos de bytes contêm, assim, bytes. Dividido no que é, na verdade, são 8 bits compostos por 1s e 0s. Se estivesse representando um número, seria qualquer número de 0 a 255 (o que, devo acrescentar, não é coincidência a razão pela qual os 4 números em um endereço IP sempre variam de 0 a 255). Fluxos de bytes são geralmente interfaces sofisticadas destinadas a ocultar a matriz básica de bytes subjacente usada para armazenar um buffer circular (você preenche o buffer e espera que alguém o esvazie, e nesse momento ele simplesmente preenche o buffer novamente).
O que diabos isso representa? Bem, isso pode representar um arquivo de texto, uma imagem ou uma transmissão de vídeo ao vivo. O que é depende inteiramente do contexto de quem o está lendo. A representação hexadecimal é outra maneira de dizer a mesma coisa, embora às vezes seja mais conveniente gerenciar bytes em termos de sua representação hexadecimal, em vez de números, mas é a mesma coisa.
Quando você está se referindo a dados brutos, geralmente está se referindo a dados de bytes. Os dados vêm sem uma tag dizendo "Eu sou um arquivo de imagem!" Normalmente, você lida apenas com dados brutos quando realmente não se importa com o que os dados representam em geral. Por exemplo, se eu quisesse converter uma imagem para sua versão em preto e branco, eu poderia dizer para ler os dados brutos de uma imagem e para cada 3 bytes lidos (que na verdade seria representação da cor vermelha, representação da cor verde e representação de azul), adicione seu valor numérico e divida por 3, depois escreva esse valor 3 vezes. Basicamente, o que eu estaria fazendo é calcular a média dos valores de vermelho, verde e azul de um pixel e criar um pixel equivalente em cinza a partir disso. No entanto, quando você fala sobre executar operações com dados no nível de "byte a byte", você não
Ou talvez você queira salvar um arquivo em um banco de dados, mas ele solicita que você insira seus "dados brutos" em um tipo de dados de blob. Isso significa simplesmente converter os dados de um arquivo em uma grande matriz de bytes que o banco de dados possa entender e gerenciar. Você descobrirá que, quando recuperar esse valor do banco de dados, ele será simplesmente uma matriz de bytes grande, como você inicialmente forneceu ao banco de dados. Se esses dados eram um arquivo, você, o programador, deve reinterpretar esses dados como se estivesse lendo um arquivo, um byte por vez.
Se alguém lhe pedisse para "reverter os dados de 4 bytes", eu assumiria que se refere à interpretação de números big endian vs little endian, que escreve números começando com o byte mais ou menos significativo. Não importa se um número é representado como big endian ou little endian, apenas que todos os sistemas que lêem o número o interpretam de maneira consistente.
Isso não quer dizer que a representação numérica real (ou representação hexadecimal) seja alterada, simplesmente que a ordem na qual esses 4 bytes formam um número deve ser revertida. Digamos que você tenha 0x01, 0x02, 0x03 e 0x04. Para revertê-los, você teria 0x04, 0x03, 0x02, 0x01. Presumivelmente, o sistema leria esses 4 bytes na ordem inversa e, como você já o inverteu, o valor é interpretado como o mesmo que o pretendido nos dados brutos.
Espero que isso explique!