web-dev-qa-db-fra.com

Quelle est la sortie de `cat image.png`?

Que signifie la sortie lorsque vous faites cat image.png?

Est-ce que l'image est réellement faite?

L'extension de fichier de l'image est-elle importante?

3
NerdOfCode

cat imprimera le contenu du fichier (les zéros et ceux qui seront mappés à des caractères sans signification, car ils ne sont pas vraiment des caractères exacts?) Dans stdout qui est par défaut votre terminal.

L'extension de fichier est pour nous (humains), pour comprendre facilement quel est le type de fichier; certains programmes l'utilisent aussi pour l'ouvrir, mais la plupart des programmes détectent le type de fichier en utilisant un en-tête à l'intérieur du fichier.

Utilisez file file.png pour obtenir le type de fichier ou xxd file.png:

00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452  .PNG........IHDR
00000010: 0000 0002 0000 0002 0800 0000 0057 dd52  .............W.R
00000020: f800 0000 0e49 4441 5478 9c63 6c60 6062  .....IDATx.cl``b
00000030: 6000 0002 9200 84f7 7ca3 5800 0000 0049  `.......|.X....I
00000040: 454e 44ae 4260 82                        END.B`.

pour obtenir un vidage hexadécimal du contenu du fichier, notez le "PNG" dans la première ligne.

Également de cette référence de signatures de fichier nous pouvons voir que la signature PNG est:

PNG     89 50 4E 47 0D 0A 1A 0A     PNG image
11
Ravexina

cat affiche simplement le contenu du fichier dans stdoutstream , qui dans votre cas se trouve être terminal. Qu'est-ce qui se passe avec la séquence de 0 et 1 qui composent le fichier est à la hauteur du terminal. Dans le cas d'un fichier binaire, les séquences de bits qui ne sont pas du texte ne seront pas reconnues en tant que texte.

Considérez par exemple cating un fichier contenant des caractères UTF, tel que le chinois dans deux terminaux différents - un qui prend en charge les caractères UTF (terminator dans la capture d'écran ci-dessous) et un autre qui ne contient pas support (xterm dans la capture d'écran ci-dessous). Comme vous pouvez le voir, certains caractères ne sont pas interprétés. cat affichera le contenu dans les deux cas, mais comment interpréter ce contenu - cela dépend de chaque terminal.

enter image description here

Maintenant, si vous redirigez stdout stream vers un fichier, vous créez effectivement une copie, à peu près la même chose que cp original copy ou mv old new. Dans de rares cas, vous voudrez peut-être scinder deux fichiers - binaire ou texte - ce qui est également possible avec cat. L'idée est la même. Conformément à définition POSIX , "[les] fichiers d'entrée peuvent être n'importe quel type de fichier", ce qui signifie que cat peut lire n'importe quel fichier. Cependant, dans certains cas, cat prendra le mode texte. Dans le cas de la cat d'Ubuntu (fournie par le paquetage GNU coreutils), fournie dans info cat, on peut lire:

"Cat" lit en mode texte si l’une des options "-bensAE" est utilisée ou si "cat" lit une entrée standard et que cette entrée est un terminal. De même, ‘cat’ écrit en mode texte si l’une des options ‘-bensAE’ est utilisée ou si la sortie standard est un terminal.

Bien sûr, si nous voulons réellement visualiser le contenu des fichiers binaires dans un format lisible, nous pouvons utiliser des éditeurs hexadécimaux ou tout type de programme "dump", le gestionnaire de fichiers Midnight Commander , ou même vi éditeur de texte . Il y a une bonne liste de ces ici et ici déjà.

9

Les images sont composées d'octets. Ainsi sont des fichiers texte

Lorsqu'une application logicielle, par exemple cat veut lire des fichiers texte, elle commence à lire des octets et recherche ces octets dans des codages de caractères tels que ascii ou unicode. Il trouve le caractère dans la table et le restitue.

Mais les images n'ont pas de caractères (ce n'est peut-être pas le cas mais ce n'est pas ce qui construit l'image) et vous pouvez deviner ce qui se passe lorsque vous essayez de traiter les octets formatés comme s'ils étaient des caractères. vous obtenez des caractères aléatoires pour chaque fichier.

Si vous voulez voir les chaînes d'un fichier, utilisez la commande strings.

3
A.Esm.T