¿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?
stream-processing
usuario2720323
fuente
fuente
Respuestas:
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!
fuente
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 ...
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.
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ía0x68 0x67 0x66 0x65
. Si estuvieras viendo estos datos en términos de caracteres, originalmente los tendríasA B C D
, pero ahora los tienesD 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.
fuente
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.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
FE
podría representar un byte: los bits11111110
que tienen el valor decimal255
. Sin embargo, enFE
realidad es una cadena de caracteres que consta de los caracteresF
yE
, que requiere dos bytes en el conjunto de caracteres US-ASCII o ISO-646. Estos dos bytes son lo queFE
es , y el byte único con valor 254 es lo queFE
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).
fuente
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).
fuente