¿Alguien puede explicarme qué flujo de bytes contiene realmente? ¿Contiene bytes (datos hexadecimales) o datos binarios o solo letras en inglés? También me confunde el término «datos sin procesar». Si alguien me pide que «invierta los datos de 4 bytes», ¿qué debo asumir que los datos son código hexadecimal o código binario?
Comentarios
- Mis dos centavos no son dignos de respuesta (y ya hay buenos a continuación), pero solo quiero proporcionar enlaces a estos 2 artículos que probablemente brinden una buena perspectiva sobre cómo » datos sin procesar » se interpreta como algo que realmente significa algo (no ‘ no significa nada a menos que sepa lo que se supone que representa y cómo está codificado / almacenado) betterexplained.com/articles/… joelonsoftware. com / articles / Unicode.html
- Creo que java creó un byte para evitar el uso de c / c ++ ‘ s char para cosas que pueden ‘ t debe entenderse como un personaje. char se usó mucho en c / c ++ porque el tamaño de char es 1 byte. También los dispositivos en Unix son dispositivos de bloques y caracteres. Si lee desde dispositivos char, obtiene un flujo de caracteres / bytes sin firmar.
- El flujo de bytes es ambiguo. El flujo de octetos no lo es.
- 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 un fragmento de bytes, o como usted dice, un flujo de bytes . Incluso más arriba, comienza a interpretar los datos sin procesar. Los bytes se pueden interpretar como texto de muchas formas (codificaciones). También números enteros (endian grande o pequeño). Incluso puedes subir más alto. Tienes un archivo zip. Ese archivo zip es tu copia de seguridad de ayer. Etcétera. El problema es que el nivel exacto a menudo está implícito y no se aclara, y esto puede resultar confuso.
Respuesta
Los flujos de bytes contienen, bueno, bytes. Desglosado en lo que es en realidad, son 8 bits compuestos por 1 y 0. Si representara un número, sería cualquier número del 0 al 255 (lo cual, debo agregar, no es una coincidencia por qué los 4 números en una dirección IP siempre van de 0 a 255). Byte streams suelen ser interfaces sofisticadas destinadas a ocultar la matriz de bytes básica subyacente que se utiliza para contener un búfer circular (llena el búfer y espera a que alguien lo vacíe, momento en el que simplemente llena el búfer otra vez).
¿Qué diablos representa eso? Bueno, podría representar un archivo de texto, una imagen o una transmisión de video en vivo. Lo que es depende completamente del contexto de quién lo lee. 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, normalmente se refiere a datos de bytes. Los datos vienen sin una etiqueta que diga «¡Soy un archivo de imagen!» Por lo general, solo trata con datos sin procesar cuando no lo hace » Realmente me importa lo que representan los datos en general. Por ejemplo, si quisiera convertir una imagen a su versión en blanco y negro, podría decir que lea los datos sin procesar de una imagen y por cada 3 bytes leídos (que en realidad sería la representación del color rojo, la representación del color verde y representación del color azul), agregue su valor numérico y divídalo por 3, luego escriba ese valor 3 veces. Básicamente, lo que haría es promediar los valores de rojo, verde y azul de un píxel y hacer su píxel equivalente gris a partir de ese Sin embargo, cuando habla de realizar operaciones con datos en el nivel de «byte por byte», realmente no le importa el panorama general, por así decirlo.
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 blob. Esto simplemente significa convertir los datos de un archivo en una gran matriz de bytes que la base de datos pueda comprender y administrar. Encontrará que cuando recupere ese valor de la base de datos, será simplemente una matriz de bytes grande como la que proporcionó inicialmente a la base de datos. Si esos datos eran un archivo, entonces usted, el programador, debe reinterpretar ese byte datos como si estuviera leyendo un archivo de un byte a la vez.
Si alguien le pide que «invierta los datos de 4 bytes», asumiría que se refiere a la interpretación de números de big-endian frente a 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 coherente.
Este No es decir que la representación del número real (o la representación hexadecimal para el caso) haya cambiado, simplemente que el orden en el que estos 4 bytes forman un número debe invertirse. Digamos que tiene 0x01, 0x02, 0x03 y 0x04.Para revertirlos, tendrías 0x04, 0x03, 0x02, 0x01 en su lugar. El sistema probablemente leería estos 4 bytes en el orden inverso y como ya lo has invertido, el valor se interpreta como el mismo que fue previsto en los datos sin procesar.
¡Espero que eso lo explique!
Comentarios
- ¡Todo está bien ..! ¿Puede elaborar la respuesta con respecto a » datos sin procesar «?
- @ user2720323 De acuerdo, modificado para explicar mejor » datos sin procesar. » 🙂
- 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 se puede interpretar como un archivo ASCII y viceversa. El texto o la imagen puede no tener sentido, pero aún es posible. (Derp … Debería haber leído las siguientes respuestas)
- @kevincline Por favor, trate de apreciar el hecho de que ‘ estoy tratando de transmitir una idea. Mi prioridad no es ‘ t escribir un algoritmo preciso. Si desea ser más preciso, ‘ pesará los valores rojo, verde y azul de acuerdo con lo que el ojo humano puede percibir.
Respuesta
Un byte es simplemente una unidad de información; puede ser cualquier cosa. Un byte por sí solo no significa nada, tienes que darle algún tipo de significado.
Entonces, para expandir eso –
¿Contiene bytes (datos hexadecimales) o datos binarios o solo letras en inglés?
Los datos hexadecimales son lo mismo que los datos binarios. Es » 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 pide que «invierta los datos de 4 bytes», ¿qué debo asumir que son los datos? ¿código hexadecimal o código binario?
Dado que hexadecimal es solo una representación de los datos, no importa cómo piense al respecto. Si tienes datos de 0x65 0x66 0x67 0x68
, para revertirlos obtendrás 0x68 0x67 0x66 0x65
. Si miras estos datos en términos de caracteres, originalmente tendrías A B C D
, pero ahora tienes D C B A
.
De vuelta a una secuencia de bytes – it Es solo una secuencia de datos. Necesita saber qué representan los datos para poder usarlos. Si estamos leyendo un archivo de texto, el flujo de bytes que obtendría cuando esté leyendo el archivo serían simplemente caracteres de algún tipo. Un archivo ejecutable tendría un montón de caracteres no imprimibles, por lo que se llamaría archivo binario . Claramente, es posible abrir un ejecutable en un editor de texto, pero no hace nada útil.
Comentarios
- +1 pero el énfasis en binario en el bit lat parece fuera de lugar. » datos binarios » a menudo contienen caracteres no imprimibles, pero ‘ se denominan » binary » porque ‘ se compone de dígitos binarios, no porque contenga caracteres no imprimibles . Entiendo que ‘ estás usando » binary » en oposición al » text » datos, pero creo que esto puede confundir aún más al OP.
- Tengo una pregunta sobre la reversión. .Si tengo un entero (32 bits) 325487 en un archivo, ¿cómo puedo revertir este entero de 4 bytes? De manera similar, tengo una palabra (» hai, ¿cómo estás «), cómo invertir esta cadena asumiendo cada carácter como un byte.
- @ user2720323
int reverseX = ((x & 0xFF000000) >> 24) + ((x & 0x00FF0000) >> 8) + ((x & 0x0000FF00) << 8) + ((x & 0x000000FF) << 24);
Esto literalmente toma cada byte, lo coloca en la posición correcta y lo combina con los demás.
Respuesta
Un flujo 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 ampliamente que un byte consta de ocho bits. Si queremos ser más precisos, usamos el término flujo de octetos 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 bits 11111110
que tienen el valor decimal 255
.Sin embargo, FE
es en realidad una cadena de caracteres que consta de los caracteres F
y E
, que requiere dos bytes en el juego 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 se describe un canal de comunicación, un identificador de archivo o algún dispositivo similar como que lleva un flujo de bytes y no se proporciona ninguna otra información, es casi seguro que no significa que los bytes se representan como texto hexadecimal , de modo que cada byte abstracto en la secuencia requiere dos bytes físicos.
Y los datos brutos simplemente significan bits que no se interpretan como si tuvieran una estructura más allá de la «matriz de bits». Los datos brutos generalmente tienen una estructura y representan algo, pero cuando los miramos como datos brutos, o estamos ignorando la interpretación por el momento (por ejemplo, estamos viendo la representación sin procesar de un tipo de datos para verificar su exactitud hacia abajo). al detalle a nivel de bits), o la interpretación no está disponible (tenemos algunos datos, pero no entendemos la estructura de los datos y lo que representan).
Comentarios
Respuesta
Un byte es 8 bits. Un bit es 0 o 1. Los «datos brutos» 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 se asignan bytes a caracteres, como ascii. Escriba «ascii» en una línea de comandos de Unix y obtendrá una tabla grande que asigna los valores de bytes 0-255 o (0-FF hexadecimal) 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, I «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úscalos para obtener más información sobre por qué es útil mezclar los bytes en un flujo de bytes sin procesar.)