Alguém pode me explicar o que o fluxo de bytes realmente contém? Ele contém bytes (dados hexadecimais) ou dados binários ou apenas 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”, então o que devo presumir que os dados são código hexadecimal ou código binário?
Comentários
- Meus dois centavos não são dignos de resposta (e já há alguns bons abaixo), mas eu apenas quero fornecer links para esses 2 artigos que provavelmente fornecerão uma boa visão sobre como ” dados brutos ” é interpretado como realmente significando algo (não ‘ não significa nada, a menos que você saiba o que é suposto representar e como é codificado / armazenado) betterexplained.com/articles/… joelonsoftware. com / articles / Unicode.html
- Acho que java criou byte para evitar o uso de c / c ++ ‘ s char para coisas que podem ‘ t ser entendido como um personagem. 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ê em dispositivos char, obtém um fluxo de caracteres / bytes não assinados.
- O fluxo de bytes é ambíguo. O fluxo de octeto não.
- Os dados podem ser interpretados em muitos níveis. Na parte inferior, ‘ é apenas uma série de níveis elétricos liga-desliga. Um pouco mais acima, ‘ é um bloco 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 (big ou little endian). Você pode até subir mais alto. Você tem um arquivo zip. Esse arquivo zip é o seu backup de ontem. E assim por diante. O problema é que o nível exato geralmente está implícito e não é esclarecido, e isso pode ser confuso.
Resposta
Os fluxos de bytes contêm, bem, bytes. Dividido no que realmente é, são 8 bits compostos de 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 porque os 4 números em um endereço IP sempre variam de 0 a 255). Os fluxos de bytes são geralmente interfaces sofisticadas destinadas a ocultar a matriz de bytes básica subjacente usada para manter um buffer circular (você enche o buffer e espera que alguém o esvazie, momento em que ele simplesmente preenche o buffer de novo).
O que diabos isso representa? Bem, 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 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, no entanto, é a mesma coisa.
Quando você está se referindo a dados brutos, normalmente está se referindo a dados de bytes. Os dados vêm sem uma tag dizendo “Eu sou um arquivo de imagem!” Normalmente, você só lida com dados brutos quando não ” Eu realmente me importo com o que os dados representam de modo geral. Por exemplo, se eu quisesse converter uma imagem em sua versão em preto e branco, poderia dizer para ler os dados brutos de uma imagem e para cada 3 bytes lidos (o que seria realmente uma representação da cor vermelha, representação da cor verde e representação da cor azul), some seu valor numérico e divida por 3, depois escreva esse valor 3 vezes. Essencialmente, o que eu estaria fazendo é calcular a média dos valores de vermelho, verde e azul de um pixel e tornar seu pixel cinza equivalente a partir disso No entanto, quando você fala sobre realizar operações com dados no nível de “byte por byte”, você realmente não se importa com o quadro geral, por assim dizer.
Ou talvez você deseje salvar um arquivo em um banco de dados, mas ele pede 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ê verá que, ao recuperar esse valor do banco de dados, ele será simplesmente uma grande matriz de bytes, conforme inicialmente fornecido ao banco de dados. Se esses dados eram um arquivo, então você, o programador, deve reinterpretar esse byte dados como se você estivesse lendo um arquivo, um byte de cada vez.
Se alguém pedisse para você “reverter os dados de 4 bytes”, eu assumiria que se refere à interpretação big-endian vs little-endian dos números , que grava 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 leem o número o interpretem de forma consistente.
Isso Não quer dizer que a representação real do número (ou representação hexadecimal) foi alterada, simplesmente que a ordem em que esses 4 bytes formam um número deve ser invertida. Digamos que você tenha 0x01, 0x02, 0x03 e 0x04.Para revertê-los, você teria 0x04, 0x03, 0x02, 0x01 em vez disso. O sistema provavelmente leria esses 4 bytes na ordem inversa e, como você já inverteu, o valor é interpretado como sendo o mesmo pretendido nos dados brutos.
Espero que isso explique!
Comentários
- Está tudo bem ..! Você pode elaborar a resposta em relação aos ” dados brutos “?
- @ user2720323 Ok, modificado para explicar melhor ” dados brutos. ” 🙂
- 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 metadados (extensão do 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 as próximas respostas)
- @kevincline Por favor, tente apreciar o fato de que eu ‘ estou tentando transmitir uma ideia. Minha prioridade não é ‘ t escrever um algoritmo preciso. Se você quiser ser mais preciso, ‘ d pondere os valores de vermelho, verde e azul de acordo com o que o olho humano pode perceber.
Resposta
Um byte é simplesmente uma unidade de informação – pode ser qualquer coisa. Um byte por si só não significa nada, você deve atribuir algum significado a ele.
Então, para expandir isso –
Ele contém bytes (dados hexadecimais) ou dados binários ou apenas letras em inglês?
Dados hexadecimais são iguais aos dados binários. é apenas uma maneira diferente de exibir os dados. Por exemplo, 0x41 = 0b01000001 = “A” = 65 (decimal). Letras em inglês seriam apenas um subconjunto disso.
Se alguém me pedisse para “reverter os dados de 4 bytes”, o que devo presumir que os dados são código hexadecimal ou binário?
Visto que 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ê-los você obteria 0x68 0x67 0x66 0x65
. Se você estivesse olhando esses dados em termos de caracteres, você originalmente teria A B C D
, mas agora você tem D C B A
.
Voltar para um fluxo de bytes – isso “é 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, por isso seria chamado de arquivo binário . Claramente, é possível abrir um executável em um editor de texto, mas ele não faz nada de útil.
Comentários
- +1 mas a ênfase em binário no bit lat parece errada. ” dados binários ” geralmente contêm caracteres não imprimíveis, mas ‘ são chamados de ” binário ” porque ‘ é composto de dígitos binários, não porque contém caracteres não imprimíveis . Eu entendo que você ‘ está usando ” binário ” em oposição a ” text ” dados, mas acho que isso pode confundir ainda mais o OP.
- Tenho uma pergunta sobre a reversão. .Se eu tiver um inteiro (32 bits) 325487 em um arquivo, como posso reverter esse inteiro de 4 bytes? da mesma forma, tenho uma palavra (” hai, como vai você “), como reverter essa string assumindo cada caractere como um byte.
- @ user2720323
int reverseX = ((x & 0xFF000000) >> 24) + ((x & 0x00FF0000) >> 8) + ((x & 0x0000FF00) << 8) + ((x & 0x000000FF) << 24);
Isso pega literalmente cada byte, muda-o para a posição certa e combina com os outros.
Resposta
Um fluxo de bytes é uma sequência ordenada de bytes. Existe um primeiro byte, que não tem predecessor. Seu sucessor é o segundo byte e assim por diante. Hoje em dia, um byte é amplamente conhecido como composto de oito bits. Se quisermos ser mais precisos, usamos os termos fluxo de octeto 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 bits 11111110
que têm o valor decimal 255
.No entanto, FE
é na verdade uma sequência de caracteres que consiste nos caracteres F
e 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 for descrito como transportando um fluxo de bytes e nenhuma outra informação é fornecida, quase certamente não significa que os bytes são representados como texto hexadecimal , de modo que cada byte abstrato no fluxo requer dois bytes físicos.
E dados brutos simplesmente significam bits que não são interpretados como tendo qualquer estrutura além de apenas “matriz de bits”. Os dados brutos geralmente têm uma estrutura e representam algo, mas quando estamos olhando para eles como dados brutos, estamos ignorando a interpretação no momento (por exemplo, estamos olhando para a representação bruta de um tipo de dados para verificar se está correto ao nível de detalhe de bits), 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).
Comentários
- O PDP-10 tinha instruções para lidar com bytes de tamanho variável. O mais comum era ASCII de sete bits, seguido por caracteres de seis bits.
Resposta
Um byte é 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úmero aleatório, etc.
-
Existem várias maneiras de exibir um byte: binário (01110110) , hex = hexadecimal (7C), octal (0271) ou decimal (215). Em todos os casos, o valor máximo é 255 (base 10).
-
Às vezes, os 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 byte 0-255 ou (0-FF hex) para o caractere associado. Por exemplo, o espaço é x20 e “A” é x40 . Observe que alguns valores de byte mapeiam para controlar caracteres e não podem ser impressos. Mas os bytes em si não são caracteres – eles são apenas um pacote de bits. Um número.
-
“reverter 4 bytes” seria pegar alguns bytes 123 42 231 0 e inverter a ordem – 0 231 42 123. Aplicado a um byte steam, I “d provavelmente ler 4 bytes, invertê-los, ler os próximos 4 bytes, etc.
(A propósito, esse problema é relevante, porque se você quiser representar um número maior que 255 como byes, você precisa usar mais de um byte. Mas a questão é: o byte “maior” vem primeiro ou por último? Chama-se big endian ou little endian – procure-os para obter mais informações sobre o motivo é útil embaralhar os bytes em um fluxo de bytes bruto.)