¿Qué es un flujo de bytes en realidad?

34

¿Alguien puede explicarme qué contiene el flujo de bytes? ¿Contiene bytes (datos hexadecimales) o datos binarios o letras en inglés solamente? También estoy confundido sobre el término "datos en bruto". Si alguien me pidió que "invirtiera los datos de 4 bytes", ¿qué debo suponer que los datos son código hexadecimal o código binario?

usuario2720323
fuente
Mis dos centavos no son una respuesta digna (y ya hay algunos buenos a continuación), pero solo quiero proporcionar enlaces a estos 2 artículos que probablemente proporcionarán una buena idea sobre cómo se interpreta que los "datos en bruto" realmente significan algo (no significa cualquier cosa a menos que sepa lo que se supone que representa y cómo se codifica / almacena) betterexplained.com/articles/… joelonsoftware.com/articles/Unicode.html
Michael
1
Creo que Java creó un byte para evitar el uso de char de c / c ++ para cosas que no se pueden entender como un personaje. char se usó mucho en c / c ++ porque el tamaño de char es de 1 byte. También los dispositivos en Unix son dispositivos de bloque y de caracteres. Si lees desde dispositivos char, obtienes una secuencia de caracteres / bytes sin firmar.
imel96
El flujo de bytes es ambiguo. Octet stream no lo es.
Deer Hunter
Los datos se pueden interpretar en muchos niveles. En la parte inferior, es solo una serie de niveles eléctricos de encendido y apagado. Un poco más arriba es una porción de bytes, o como dices, una secuencia de bytes . Incluso más arriba comienzas a interpretar los datos en bruto. Los bytes se pueden interpretar como texto de muchas maneras (codificaciones). Números enteros también (endian grande o pequeño). Incluso puedes ir más arriba. Tienes un archivo zip. Ese archivo zip es tu copia de seguridad de ayer. Y así. El problema es que el nivel exacto a menudo está implícito y no se aclara, y esto puede ser confuso.
finalmente el

Respuestas:

52

Las secuencias de bytes contienen, bueno, bytes. Desglosado en lo que realmente es, son 8 bits compuestos de 1s y 0s. Si representara un número, sería cualquier número de 0 a 255 (lo cual, puedo agregar, no es una coincidencia por qué los 4 números en una dirección IP siempre varían de 0 a 255). Las secuencias de bytes suelen ser interfaces sofisticadas destinadas a ocultar la matriz de bytes básica subyacente utilizada para contener un búfer circular (usted llena el búfer y espera a que alguien lo vacíe, en ese momento simplemente vuelve a llenar el búfer).

¿Qué diablos representa eso? Bueno, podría representar un archivo de texto, o una imagen, o una transmisión de video en vivo. Lo que es depende completamente del contexto de quién lo está leyendo. La representación hexadecimal es otra forma de decir lo mismo, aunque a veces es más conveniente administrar bytes en términos de su representación hexadecimal en lugar de números, sin embargo, es lo mismo.

Cuando se refiere a datos sin procesar, generalmente se refiere a datos de bytes. Los datos vienen sin una etiqueta que diga "¡Soy un archivo de imagen!" Por lo general, solo maneja datos sin procesar cuando realmente no le importa lo que los datos representan en general. Por ejemplo, si quisiera convertir una imagen a su versión en blanco y negro, podría decir que lea los datos en bruto de una imagen y por cada 3 bytes leídos (que en realidad sería una representación de color rojo, una representación de color verde y una representación de color azul), agregue su valor numérico y divídalo entre 3, luego escriba ese valor 3 veces. Esencialmente, lo que estaría haciendo es promediar los valores rojo, verde y azul de un píxel y hacer su píxel gris equivalente a partir de eso. Sin embargo, cuando habla de realizar operaciones con datos en el nivel de "byte por byte", no

O tal vez desee guardar un archivo en una base de datos, pero le pide que inserte sus "datos sin procesar" en un tipo de datos de blob. Esto simplemente significa convertir los datos de un archivo en una gran matriz de bytes que la base de datos puede comprender y administrar. Descubrirá que cuando recupera ese valor de la base de datos, será simplemente una matriz de bytes grande como se proporcionó inicialmente a la base de datos. Si esos datos eran un archivo, entonces usted, el programador, debe reinterpretar esos datos de bytes como si estuviera leyendo un archivo de un byte a la vez.

Si alguien le pidiera que "invierta los datos de 4 bytes", supongo que se refiere a la interpretación de números big-endian vs little-endian, que escribe números que comienzan con el byte más o menos significativo. No importa si un número se representa como big-endian o little-endian, solo que todos los sistemas que leen el número lo interpretan de manera consistente.

Esto no quiere decir que la representación numérica real (o la representación hexadecimal) cambie, simplemente que el orden en que estos 4 bytes forman un número debe invertirse. Digamos que tienes 0x01, 0x02, 0x03 y 0x04. Para revertir estos, tendría 0x04, 0x03, 0x02, 0x01 en su lugar. Presumiblemente, el sistema leería estos 4 bytes en el orden inverso y, como ya lo ha invertido, el valor se interpreta como el mismo que se pretendía en los datos sin procesar.

¡Espero que esto lo explique!

Neil
fuente
Todo esta bien ..! ¿Puede por favor elaborar la respuesta con respecto a los "datos en bruto"?
user2720323
@ user2720323 Bien, modificado para explicar mejores "datos en bruto". :)
Neil
Una cosa a tener en cuenta ... todos los datos son simplemente una colección de bytes. El significado de esos bytes está definido por algún tipo de metadatos (extensión de archivo, campo de base de datos, etc.). Un archivo de imagen puede interpretarse como un archivo ASCII y viceversa. El texto o la imagen pueden no tener sentido, pero aún es posible. (Derp ... debería haber leído las siguientes respuestas)
Dave Nay
2
@kevincline Intente apreciar el hecho de que estoy tratando de transmitir una idea. Mi prioridad no es escribir un algoritmo preciso. Si quisiera ser más preciso, sopesaría los valores rojo, verde y azul de acuerdo con lo que el ojo humano puede percibir.
Neil
18

Un byte es simplemente una unidad de información: puede ser cualquier cosa. Un byte en sí mismo no significa nada, tienes que darle algún tipo de significado.

Entonces, para ampliar eso ...

¿Contiene bytes (datos hexadecimales) o datos binarios o letras en inglés solamente?

Los datos hexadecimales son los mismos que los datos binarios. Es solo una forma diferente de mostrar los datos. Por ejemplo, 0x41 = 0b01000001 = 'A' = 65 (decimal). Las letras en inglés serían solo un subconjunto de eso.

Si alguien me pidió que "invirtiera los datos de 4 bytes", ¿qué debo suponer que los datos son código hexadecimal o código binario?

Dado que hexadecimal es solo una representación de los datos, no importa cómo lo pienses. Si tiene datos de 0x65 0x66 0x67 0x68, para revertirlo obtendría 0x68 0x67 0x66 0x65. Si estuvieras viendo estos datos en términos de caracteres, originalmente los tendrías A B C D, pero ahora los tienes D C B A.

Volver a una secuencia de bytes: es solo una secuencia de datos. Necesita saber qué representan los datos para usarlos. Si estamos leyendo un archivo de texto, la secuencia de bytes que obtendría al leer el archivo sería solo algún tipo de caracteres. Un archivo ejecutable tendría un montón de caracteres no imprimibles, por lo que se llamaría un archivo binario . Claramente, es posible abrir un ejecutable en un editor de texto, pero no hace nada útil.

rm5248
fuente
1
+1 pero el énfasis en binario en el bit lat parece fuera de lugar. Los "datos binarios" a menudo contienen caracteres no imprimibles, pero se llaman "binarios" porque están formados por dígitos binarios, no porque contengan caracteres no imprimibles. Entiendo que está utilizando "binario" en oposición a los datos de "texto" imprimibles, pero creo que esto puede confundir aún más el OP.
Caleb
Tengo una pregunta con respecto a la inversión. Si tengo un entero (32 bits) 325487 en un archivo, ¿cómo puedo revertir este entero de 4 bytes? Del mismo modo, tengo una palabra ("hai, cómo estás"), cómo revertir esta cadena asumiendo cada carácter como un byte.
user2720323
@ user2720323 int reverseX = ((x & 0xFF000000) >> 24) + ((x & 0x00FF0000) >> 8) + ((x & 0x0000FF00) << 8) + ((x & 0x000000FF) << 24); Esto literalmente toma cada byte, lo cambia a la posición correcta y se combina con los demás.
Neil
2

Una secuencia de bytes es una secuencia ordenada de bytes. Hay un primer byte, que no tiene predecesor. Su sucesor es el segundo byte, y así sucesivamente. Hoy en día, se entiende que un byte consiste en ocho bits. Si queremos ser más precisos, usamos el término flujo octeto y octeto . Todavía existen computadoras con bytes que no tienen ocho bits de ancho.

El hexadecimal es una forma de escribir números y sirve como una representación impresa para datos binarios. Hexadecimal es en realidad texto. Por ejemplo, el valor hexadecimal FEpodría representar un byte: los bits 11111110que tienen el valor decimal 255. Sin embargo, en FErealidad es una cadena de caracteres que consta de los caracteres Fy E, que requiere dos bytes en el conjunto de caracteres US-ASCII o ISO-646. Estos dos bytes son lo que FE es , y el byte único con valor 254 es lo que FE representa , como una notación impresa.

Si un canal de comunicación, un identificador de archivo o algún dispositivo de este tipo se describe como portador de una secuencia de bytes, y no se proporciona ninguna otra información, casi con certeza no significa que los bytes estén representados como texto hexadecimal, por lo que cada byte abstracto en la secuencia requiere Dos bytes físicos.

Y los datos sin procesar simplemente significan bits que no se interpretan para tener una estructura más allá de simplemente "matriz de bits". Los datos sin procesar generalmente tienen una estructura y representan algo, pero cuando los vemos como datos sin procesar, ignoramos la interpretación por el momento (por ejemplo, estamos viendo la representación sin procesar de un tipo de datos para verificar su corrección hacia abajo). al detalle del nivel de bits), o la interpretación no está disponible (tenemos algunos datos, pero no entendemos la estructura de los datos y lo que representa).

Kaz
fuente
El PDP-10 tenía instrucciones para manejar bytes de tamaño variable. El más común fue ASCII de siete bits, seguido de caracteres de seis bits.
Kevin Cline
0

Un byte es de 8 bits. Un bit es 0 o 1. Los "datos en bruto" son solo un flujo de un byte tras otro. Un flujo de bytes puede provenir de un archivo, una conexión de red, un objeto serializado, un generador de números aleatorios, etc.

  • Hay varias formas de mostrar un byte: binario (01110110), hexadecimal (hexadecimal (7C), octal (0271) o decimal (215). En todos los casos, el valor máximo es 255 (base 10).

  • A veces, los bytes se asignan a caracteres, como ascii. Escriba "ascii" en una línea de comando de Unix, y obtendrá una gran tabla que asigna los vales de bytes 0-255 o (0-FF hex) al carácter asociado. Por ejemplo, el espacio es x20 y "A" es x40. Tenga en cuenta que algunos valores de bytes se asignan para controlar caracteres y no se pueden imprimir. Pero los bytes en sí mismos no son caracteres, son solo un paquete de bits. Un número.

  • "invertir 4 bytes" sería tomar algunos bytes 123 42 231 0 y cambiar el orden - 0 231 42 123. Aplicado a un byte de vapor, probablemente leería 4 bytes, invertirlos, leer los siguientes 4 bytes, etc. .

(Por cierto, ese problema es relevante, porque si quieres representar un número mayor que 255 como byes, necesitas usar más de un byte. Pero entonces la pregunta es, ¿el byte "más grande" viene primero o al final? Eso se llama Big Endian o Little Endian: búsquelos para obtener más información sobre por qué es útil barajar los bytes en una secuencia de bytes sin procesar).

Robar
fuente