¿Qué se produce después de usar cat en una imagen?

9

Digamos que uno crea un archivo así:

touch myFile

Ingresas un texto con vim o lo que sea, y luego usas cat myFilepara escupir el contenido en la terminal.

Ahora, ¿qué sucede cuando uso cat en cualquier imagen? Decir,

cat myPNG.png

Acabo de recibir un montón de basura. Simplemente me hizo pensar en lo que el catcomando intenta hacer y de dónde viene toda esta "basura". Sólo curioso.

Qcom
fuente

Respuestas:

22

Puede ser útil explicar cómo funcionan los archivos en el nivel más bajo:

Un archivo es una secuencia de bytes, cero o más de longitud. Un byte es de 8 bits. Como hay 256 combinaciones de 8 bits, eso significa que un byte es cualquier número del 0 al 255. Por lo tanto, cada archivo es, en su nivel más bajo, un gran trozo de números que van del 0 al 255.

Depende completamente de los programas y usuarios decidir qué "significan" los números. Si queremos almacenar texto, entonces probablemente sea una buena idea usar los números como código, donde a cada número se le asigna una letra. Eso es lo que hacen ASCII y Unicode. Si queremos mostrar texto, entonces probablemente sea una buena idea construir un dispositivo o escribir un programa que pueda tomar estos números y mostrar un mapa de bits similar al código ASCII / Unicode correspondiente. Eso es lo que hacen los terminales y los emuladores de terminal.

Por supuesto, para los gráficos, probablemente queremos que los números representen píxeles y sus colores. Luego, necesitaremos un programa que revise el archivo, lea todos los bytes y muestre la imagen en consecuencia. Un emulador de terminal espera que los bytes sean números ASCII / Unicode y se comportará de manera diferente, para la misma porción de bytes (o archivo).

LawrenceC
fuente
Excelente explicación! Me alegra que hayas bajado al nivel más bajo.
Qcom
2
@BOSS, agregaría la definición de un poco. Un bit es un DIgit Binario o un número que puede ser uno o cero. Un bit tiene dos posibilidades o 2 ^ 1 = 2. Dos bits pueden tener cuatro combinaciones o 2 × 2 = 4. Más correctamente, es 2² = 4 para 2 dígitos. 8 DIits binarios o bits pueden tener 2 ^ 8 = 2 × 2 × 2 × 2 × 2 × 2 × 2 × 2 = 256 combinaciones posibles.
penguin359
2
Nitpick / pedantería menor: un byte es de un tamaño arbitrario. Puede encontrar situaciones en las que no tiene 8 bits de ancho. "Octeto" es la terminología preferida.
Chris Down
9

Cat volca el contenido del archivo de entrada a la salida estándar, que en este caso es un dispositivo de texto: la ventana de su terminal. Dado que una imagen consta de datos binarios, lo que está viendo son los datos binarios brutos interpretados como si fueran texto ASCII. Por ejemplo, un byte con el valor 65 se mostrará como mayúscula A, 66 es mayúscula B, etc. Si abre el archivo con una aplicación capaz de interpretar el archivo de imagen correctamente, se mostrarán los contenidos binarios del archivo como una imagen

malabarista
fuente
Está bien. Gracias por la respuesta. Usted menciona un "modo de texto". ¿Hay otros modos para un terminal estándar? ¿O es la única otra forma de interpretarlo como dijiste, a través de una aplicación que puede representar correctamente ese tipo de archivo?
Qcom
44
@BOSS, no, creo que gordoco quería decir que un terminal es un dispositivo de texto. El propósito original de cates juntar archivos como en cat filea fileb > filec, si no transita por el terminal (como en este ejemplo), no importa si el archivo es de texto o binario. En el mundo de Unix, los archivos binarios y de texto se almacenan igual, solo los archivos de texto contienen un conjunto de bytes algo restringido. Un uso común de cat es dirigir el contenido del archivo a comandos que no toman los nombres de los archivos como parámetros, pero aceptan la entrada de la entrada estándar.
asoundmove
@BOSS, decir que un archivo es un archivo de texto en lugar de binario, solo significa que el contenido binario del archivo puede interpretarse como texto. Las cosas solían ser simples, o el archivo era ASCII o no lo era. Hoy en día, el archivo podría tener varios formatos de texto diferentes, incluidos ASCII, UTF8, UTF16 ... En el disco duro, todos son binarios.
asoundmove
@asoundmove: Tienes razón, debería haber dicho dispositivo de texto, en lugar del término ambiguo "modo de texto". He editado mi respuesta.
malabarista
Utilicé cat en un mapa de bits en este momento e imprimió en la terminal no solo símbolos ascii, sino también caracteres unicode (como "ڣ" y "漥"). ¿Alguna idea de por qué es esto?
Magnus