GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi Ls et Hexdump ne sont-ils pas d'accord sur la taille du fichier ?

J'ai un fichier que j'ai créé (dans vim), à des fins de test (test de sortie UTF-8 dans un client SSH). Cependant, des choses étranges se produisent dans ce fichier.

Je me suis demandé quels octets étaient dans le fichier, alors j'ai utilisé hexdump :

[email protected]:~$ hexdump -x intl.txt
0000000    9ecf    000a
0000003

Ok, il y a quatre octets là-dedans, comment le 00 et le 0a sont entrés là-dedans, je ne suis pas clair, mais peu importe. Mais c'est là que ça devient bizarre :

[email protected]:~$ ls -al intl.txt
-rw-rw-r-- 1 username username 3 Mar 26 15:14 intl.txt

Attendez, c'est trois octets? Que se passe-t-il ici ?

Comme si ce n'était pas assez étrange, hexdump -C donne une sortie très différente :

[email protected]:~$ hexdump -C intl.txt
00000000  cf 9e 0a                                          |...|
00000003

Vim est également un peu confus à propos du fichier. Quand je le démarre, il donne ceci dans la ligne d'état :

"intl.txt" 1L, 3C

En haut, cependant, je reçois ceci (en utilisant set list ):

Ϟ$
~
~
~
~

Donc, il pense qu'il y a 3 caractères, mais n'en imprime qu'un. Je pourrais comprendre s'il imprimait la koppa et une ligne blanche en dessous…

Réponse acceptée :

Comme d'autres l'ont souligné, c'est parce que hexdump -x traite les fichiers comme contenant des mots de 2 octets. Sur les systèmes Little Endian (presque tous les ordinateurs de bureau le sont), cela signifie que les octets seront échangés avant d'être affichés. Cela signifie que les valeurs d'octets sont imprimées par paires et que l'ordre de ces octets est permuté. Puisque vous avez un nombre impair d'octets, hexdump ajoute juste un zéro pour constituer la paire finale. Le zéro est ensuite échangé avec le 0a . Ceci est un comportement documenté pour hexdump , donc il ne vous ment pas !

Utilisation de hexdump -C est une meilleure commande pour obtenir une sortie formatée qui affiche les octets dans l'ordre dans lequel ils se trouvent dans le fichier. Aussi le 0a est une nouvelle ligne et a probablement été ajoutée discrètement par celui qui a créé le fichier (vim le fait par défaut). Par exemple, echo ajoutera toujours une nouvelle ligne si vous ne lui dites pas de ne pas le faire. Dans bash :

echo -e '\xcf\x9e' | hexdump -C

donnera le même résultat, mais en supprimant la nouvelle ligne avec -n donnera ce que vous attendiez :

echo -ne '\xcf\x9e' | hexdump -C

Pour arrêter vim de l'ajout de la nouvelle ligne :

:set noeol
:set binary

Linux
  1. Pourquoi le script Bash ne reconnaît-il pas les alias ?

  2. Pourquoi la méthode suivante ne modifie-t-elle pas la taille limite du fichier principal ?

  3. La différence entre .exrc et .vimrc ?

  4. Pourquoi Ls -l n'affiche-t-il pas l'heure et/ou l'année pour chaque fichier ? ?

  5. Trouver la taille du secteur d'une partition ?

Comment utiliser Sudo et le fichier Sudoers

Comment enregistrer un fichier dans Vim / Vi et quitter l'éditeur

Qu'est-ce que ZFS ? Pourquoi les gens en sont-ils fous ?

Redirection Io et commande principale ?

Trouver la taille et l'espace libre du système de fichiers contenant un fichier donné

Pourquoi la taille d'un répertoire est-elle toujours de 4096 octets sous Unix ?