Comment imprimer les valeurs (numériques) ASCII de chaque caractère d'un fichier?

11

Comment imprimer les valeurs numériques ASCII de chaque caractère dans un fichier texte. Comme cat, mais affichant uniquement les valeurs ASCII ... (hexadécimal ou décimal, c'est bien).

Un exemple de sortie pour un fichier contenant le mot Apple (avec un saut de ligne) pourrait ressembler à:

065 112 112 108 101 013 004
Mtl Dev
la source

Réponses:

17

La commande standard pour cela est od, pour le vidage octal (bien qu'avec les options, vous pouvez passer d'octal à décimal ou hexadécimal ...):

$ echo Apple | od -An -vtu1
  65 112 112 108 101  10

Notez qu'il génère la valeur d'octet de chaque octet du fichier. Cela n'a rien à voir avec ASCII ou tout autre jeu de caractères.

Si le fichier contient un A dans un jeu de caractères donné et que vous souhaitez voir 65, car c'est l'octet utilisé pour A en ASCII, vous devez alors faire:

< file iconv -f that-charset -t ascii | od -An -vtu1

Pour convertir d'abord ce fichier en ascii, puis vider les valeurs d'octets correspondantes. Par exemple, Apple<LF>dans EBCDIC-UK serait 193 151 151 147 133 37( 301 227 227 223 205 045en octal).

$ printf '\301\227\227\223\205\045' | iconv -f ebcdic-uk -t ascii | od -An -vtu1
  65 112 112 108 101  10
Stéphane Chazelas
la source
14

hexdump, od, xxdOu $YOUR_FAVORITE_LANGUAGEpeut tout faire.

% echo Apple | hexdump -C
00000000  41 70 70 6c 65 0a                                 |Apple.|
00000006
% echo Apple | perl -ne 'printf "%vd\n", $_' 
65.112.112.108.101.10
% echo Apple | clisp <( echo '(print (mapcar #'\''char-code (coerce (read-line *standard-input*) '\''list)))' )
(65 112 112 108 101)
% 
branler
la source
Excellente réponse, merci. Surtout hexdump -C. Décerné à Stéphane simplement parce que sa réponse a également résolu, et il a été le premier (par juste un cheveu), mais les deux sont excellents.
Mtl Dev
Encore une autre commande:python -c "print open('file', 'rb').read().encode('hex')"
jfs
@JFSebastian Betterecho 'Apple' | python -c "import sys;print sys.stdin.read().encode('hex')"
heemayl
@heemayl: faux. Il peut corrompre un fichier binaire sous Windows
jfs
@heemayl stdin utilise le mode texte par défaut qui peut traduire les nouvelles lignes ( os.linesep-> '\n')
jfs