O que é realmente um fluxo de bytes?

34

Alguém pode me explicar qual fluxo de bytes realmente contém? Contém apenas bytes (dados hexadecimais) ou binários ou letras em inglês? Também estou confuso sobre o termo "dados brutos". Se alguém me pediu para "reverter os dados de 4 bytes", o que devo assumir que os dados são código hexadecimal ou código binário?

user2720323
fonte
Meus dois centavos não são dignos de resposta (e já existem bons abaixo), mas só quero fornecer links para esses 2 artigos que provavelmente fornecerão uma boa visão sobre como os "dados brutos" são interpretados para realmente significar algo (isso não significa nada média se você não sabe o que é suposto para representar e como ele é codificado / armazenado) betterexplained.com/articles/... joelonsoftware.com/articles/Unicode.html
Michael
1
Acho que o java criou byte para evitar o uso do c / c ++ para coisas que não podem ser entendidas como um caractere. char foi muito usado em c / c ++ porque o tamanho de char é de 1 byte. Também os dispositivos no unix são dispositivos de bloco e caractere. Se você lê de dispositivos char, obtém um fluxo de caracteres / bytes não assinados.
Imel96 #
O fluxo de bytes é ambíguo. Octet stream não é.
Deer Hunter
Os dados podem ser interpretados em vários níveis. Na parte inferior, há apenas uma série de níveis elétricos liga-desliga. Um pouco mais alto, é um pedaço de bytes ou, como você diz, um fluxo de bytes . Ainda mais alto, você começa a interpretar os dados brutos. Os bytes podem ser interpretados como texto de várias maneiras (codificações). Números inteiros também (endian grande ou pequeno). Você pode até subir mais. Você tem um arquivo zip. Esse arquivo zip é seu backup de ontem. E assim por diante. O problema é que o nível exato geralmente está implícito e não está claro, e isso pode ser confuso.
Nalply 7/11

Respostas:

52

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!

Neil
fonte
Tudo está bem ..! Você pode elaborar a resposta referente a "dados brutos"?
user2720323
@ user2720323 Ok, modificado para explicar melhor "dados brutos". :)
Neil
Uma coisa a ter em mente ... todos os dados são simplesmente uma coleção de bytes. O significado desses bytes é definido por algum tipo de metadado (extensão de arquivo, campo do banco de dados, etc.). Um arquivo de imagem pode ser interpretado como um arquivo ASCII e vice-versa. O texto ou imagem pode não ter sentido, mas ainda é possível. (Derp ... Eu deveria ter lido os próximos respostas)
Dave Nay
2
@kevincline Por favor, tente apreciar o fato de que estou tentando transmitir uma ideia. Minha prioridade não é escrever um algoritmo preciso. Se você quisesse ser mais preciso, pesaria os valores vermelho, verde e azul de acordo com o que o olho humano pode perceber.
911 Neil
18

Um byte é simplesmente uma unidade de informação - pode ser qualquer coisa. Um byte por si só não significa nada, você deve anexar algum tipo de significado a ele.

Então, para expandir isso -

Contém apenas bytes (dados hexadecimais) ou binários ou letras em inglês?

Dados hexadecimais são os mesmos que dados binários. É apenas uma maneira diferente de exibir os dados. Por exemplo, 0x41 = 0b01000001 = 'A' = 65 (decimal). As letras em inglês seriam apenas um subconjunto disso.

Se alguém me pediu para "reverter os dados de 4 bytes", o que devo assumir que os dados são código hexadecimal ou código binário?

Como hex é apenas uma representação dos dados, não importa como você pensa sobre isso. Se você tiver dados de 0x65 0x66 0x67 0x68, para revertê-lo, você obteria 0x68 0x67 0x66 0x65. Se você estivesse vendo esses dados em termos de caracteres, originalmente o teria A B C D, mas agora o terá D C B A.

De volta a um fluxo de bytes - é apenas uma sequência de dados. Você precisa saber o que os dados representam para usá-los. Se estivermos lendo um arquivo de texto, o fluxo de bytes que você obteria ao ler o arquivo seria apenas algum tipo de caractere. Um arquivo executável teria vários caracteres não imprimíveis, e é por isso que seria chamado de arquivo binário . Claramente, é possível abrir um executável em um editor de texto, mas isso não faz nada de útil.

rm5248
fonte
1
+1, mas a ênfase no binário no bit final parece equivocada. "dados binários" geralmente contém caracteres não imprimíveis, mas é chamado de "binário" porque é composto por dígitos binários, não porque contém caracteres não imprimíveis. Entendo que você está usando "binário" em oposição a dados de "texto" imprimíveis, mas acho que isso pode confundir ainda mais o OP.
Caleb #
Estou tendo uma pergunta sobre reversão. Se eu tenho um número inteiro (32 bits) 325487 em um arquivo, como posso reverter esse número inteiro de 4 bytes? Da mesma forma, eu tenho uma palavra ("hai, como vai?"), como reverter essa string assumindo cada caractere como um byte.
user2720323
@ user2720323 int reverseX = ((x & 0xFF000000) >> 24) + ((x & 0x00FF0000) >> 8) + ((x & 0x0000FF00) << 8) + ((x & 0x000000FF) << 24); Isso literalmente pega cada byte, muda-o para a posição correta e combina com os outros.
911 Neil
2

Um fluxo de bytes é uma sequência ordenada de bytes. Há um primeiro byte, que não possui antecessor. Seu sucessor é o segundo byte, e assim por diante. Atualmente, um byte é amplamente entendido como composto por oito bits. Se queremos ser mais precisos, usamos o termo fluxo de octetos e octeto . Ainda existem computadores com bytes que não têm oito bits de largura.

Hexadecimal é uma maneira de escrever números e serve como uma representação impressa para dados binários. Hexadecimal é na verdade texto. Por exemplo, o valor hexadecimal FEpode representar um byte: os bits 11111110que possuem o valor decimal 255. No entanto, FEna verdade, é uma cadeia de caracteres composta pelos caracteres Fe E, que requer dois bytes no conjunto de caracteres US-ASCII ou ISO-646! Esses dois bytes são o que FE é , e o byte único com valor 254 é o que FE representa , como uma notação impressa.

Se um canal de comunicação, identificador de arquivo ou algum dispositivo desse tipo for descrito como portador de um fluxo de bytes e nenhuma outra informação for fornecida, isso quase certamente não significa que os bytes sejam representados como texto hexadecimal, de modo que cada byte abstrato no fluxo exija dois bytes físicos.

E dados brutos simplesmente significam bits que não são interpretados como tendo qualquer estrutura além de apenas uma "matriz de bits". Os dados brutos geralmente têm uma estrutura e representam alguma coisa, mas quando os vemos como dados brutos, estamos ignorando a interpretação no momento (por exemplo, estamos olhando a representação bruta de um tipo de dados para verificar sua correção nos detalhes do nível de bit) ou a interpretação não está disponível (temos alguns dados, mas não entendemos a estrutura dos dados e o que eles representam).

Kaz
fonte
O PDP-10 tinha instruções para lidar com bytes de tamanho variável. O mais comum era o ASCII de sete bits, seguido por caracteres de seis bits.
kevin Cline
0

Um byte é de 8 bits. Um bit é 0 ou 1. Os "dados brutos" são apenas um fluxo de um byte após o outro. Um fluxo de bytes pode vir de um arquivo, uma conexão de rede, um objeto serializado, um gerador de números aleatórios etc.

  • Existem várias maneiras de exibir um byte: binário (01110110), hex = hexidecimal (7C), octal (0271) ou decimal (215). Em todos os casos, o valor máximo é 255 (base 10).

  • Às vezes, bytes são atribuídos a caracteres, como ascii. Digite "ascii" em uma linha de comando unix e você obterá uma grande tabela que mapeia os valores de bytes 0-255 ou (0-FF hex) para o caractere associado. Por exemplo, o espaço é x20 e "A" é x40. Observe que alguns valores de bytes são mapeados para controlar caracteres e não são imprimíveis. Mas os bytes em si não são caracteres - são apenas um pacote de bits. Um número.

  • "inverter 4 bytes" seria pegar alguns bytes 123 42 231 0 e inverter a ordem - 0 231 42 123. Aplicado a um byte steam, eu provavelmente leria 4 bytes, inverta-os, lerei os próximos 4 bytes, etc. .

(Aliás, esse problema é relevante, porque se você quiser representar um número maior que 255 como bytes, precisará usar mais de um byte. Mas a questão é: o "maior" byte vem primeiro ou por último? big endian ou little endian - procure mais informações sobre por que é útil embaralhar os bytes em um fluxo de bytes bruto.)

Roubar
fonte