Wie drucke ich die (numerischen) ASCII-Werte jedes Zeichens in einer Datei?

11

Wie kann ich die numerischen ASCII-Werte jedes Zeichens in einer Textdatei drucken? Wie cat, aber nur die ASCII-Werte anzeigen ... (hexadezimal oder dezimal ist in Ordnung).

Die Beispielausgabe für eine Datei mit dem Wort Apple (mit Zeilenvorschub) sieht möglicherweise folgendermaßen aus:

065 112 112 108 101 013 004
Mtl Dev
quelle

Antworten:

17

Der Standardbefehl dafür ist odfür Oktal-Dump (obwohl Sie mit Optionen von Oktal zu Dezimal oder Hexadezimal wechseln können ...):

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

Beachten Sie, dass der Bytewert jedes Bytes in der Datei ausgegeben wird. Es hat nichts mit ASCII oder einem anderen Zeichensatz zu tun.

Wenn die Datei ein A in einem bestimmten Zeichensatz enthält und Sie 65 sehen möchten, da dies das für A in ASCII verwendete Byte ist, müssen Sie Folgendes tun:

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

Um diese Datei zuerst in ASCII zu konvertieren und dann die entsprechenden Bytewerte zu sichern. Zum Beispiel Apple<LF>in EBCDIC-UK wäre 193 151 151 147 133 37( 301 227 227 223 205 045in Oktal).

$ 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
quelle
14

hexdump, od, xxd, Oder $YOUR_FAVORITE_LANGUAGEkann das alles tun.

% 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)
% 
Thrig
quelle
Hervorragende Antwort, danke. Besonders Hexdump -C. Verliehen an Stephane, einfach weil seine Antwort ebenfalls geklärt war und er der Erste war (nur um ein Haar), aber beide sind ausgezeichnet.
Mtl Dev
Noch ein Befehl: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: falsch. Es kann eine Binärdatei unter Windows
beschädigen
@heemayl stdin verwendet standardmäßig den Textmodus, der Zeilenumbrüche ( os.linesep-> '\n')
jfs