Como imprimo os valores ASCII (numéricos) de cada caractere em um arquivo?

11

Como posso imprimir os valores numéricos ASCII de cada caractere em um arquivo de texto. Como cat, mas mostrando apenas os valores ASCII ... (hexadecimal ou decimal é bom).

A saída de exemplo para um arquivo que contém a palavra Apple (com um feed de linha) pode se parecer com:

065 112 112 108 101 013 004
Mtl Dev
fonte

Respostas:

17

O comando padrão para isso é od, para despejo octal (embora com opções, você possa alterar de octal para decimal ou hexadecimal ...):

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

Observe que ele gera o valor de byte de cada byte no arquivo. Não tem nada a ver com ASCII ou qualquer outro conjunto de caracteres.

Se o arquivo contiver um A em um determinado conjunto de caracteres e você desejar ver 65, porque esse é o byte usado para A no ASCII, será necessário:

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

Para primeiro converter esse arquivo em ascii e depois despejar os valores de bytes correspondentes. Por exemplo, Apple<LF>no EBCDIC-UK seria 193 151 151 147 133 37( 301 227 227 223 205 045em 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
fonte
14

hexdump, od, xxd, Ou $YOUR_FAVORITE_LANGUAGEpodem fazer isso.

% 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)
% 
agitar
fonte
Excelente resposta, obrigado. Especialmente hexdump -C. Concedido a Stephane simplesmente porque sua resposta também foi resolvida, e ele foi o primeiro (por apenas um fio de cabelo), mas ambos são excelentes.
Mtl Dev
Ainda outro comando: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: errado. Pode corromper um arquivo binário no Windows
jfs 9/16
@heemayl stdin usa o modo de texto por padrão que podem traduzir novas linhas ( os.linesep-> '\n')
JFS