Bagaimana cara mencetak nilai ASCII (numerik) dari setiap karakter dalam file?

11

Bagaimana saya bisa mencetak nilai ASCII numerik dari setiap karakter dalam file teks. Suka cat, tetapi hanya menampilkan nilai ASCII ... (hex atau desimal baik-baik saja).

Contoh output untuk file yang mengandung kata Apple (dengan umpan baris) mungkin terlihat seperti:

065 112 112 108 101 013 004
Mtl Dev
sumber

Jawaban:

17

The standar perintah untuk itu adalah od, untuk dump oktal (meskipun dengan pilihan, Anda dapat mengubah dari oktal ke desimal atau heksadesimal ...):

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

Perhatikan bahwa output nilai byte setiap byte dalam file. Itu tidak ada hubungannya dengan ASCII atau set karakter lainnya.

Jika file tersebut berisi A dalam set karakter yang diberikan, dan Anda ingin melihat 65, karena itu byte yang digunakan untuk A di ASCII, maka Anda perlu melakukan:

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

Untuk pertama-tama mengonversi file itu ke ascii dan kemudian membuang nilai byte yang sesuai. Misalnya Apple<LF>di EBCDIC-UK akan menjadi 193 151 151 147 133 37( 301 227 227 223 205 045dalam 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
sumber
14

hexdump, od, xxd, Atau $YOUR_FAVORITE_LANGUAGEsemua bisa melakukannya.

% 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
sumber
Jawaban yang bagus, terima kasih. Terutama hexdump -C. Diberikan kepada Stephane hanya karena jawabannya juga diselesaikan, dan dia adalah yang pertama (hanya dengan rambut), tetapi keduanya sangat baik.
Mtl Dev
Namun perintah lain:python -c "print open('file', 'rb').read().encode('hex')"
jfs
@JFSebastian Lebih Baikecho 'Apple' | python -c "import sys;print sys.stdin.read().encode('hex')"
heemayl
@ heemayl: salah. Ini dapat merusak file biner pada Windows
jfs
@heemayl stdin menggunakan mode teks secara default yang dapat menerjemahkan baris baru ( os.linesep-> '\n')
jfs