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?
stream-processing
user2720323
fonte
fonte
Respostas:
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!
fonte
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 -
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.
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ê obteria0x68 0x67 0x66 0x65
. Se você estivesse vendo esses dados em termos de caracteres, originalmente o teriaA 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.
fonte
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.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
FE
pode representar um byte: os bits11111110
que possuem o valor decimal255
. No entanto,FE
na verdade, é uma cadeia de caracteres composta pelos caracteresF
eE
, que requer dois bytes no conjunto de caracteres US-ASCII ou ISO-646! Esses dois bytes são o queFE
é , e o byte único com valor 254 é o queFE
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).
fonte
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.)
fonte