Jak wydrukować (numeryczne) wartości ASCII każdego znaku w pliku?

11

Jak wydrukować wartości liczbowe ASCII każdego znaku w pliku tekstowym. Podobnie cat, ale pokazuje tylko wartości ASCII ... (szesnastkowy lub dziesiętny jest w porządku).

Przykładowe dane wyjściowe dla pliku zawierającego słowo Apple (z wierszem) mogą wyglądać następująco:

065 112 112 108 101 013 004
Mtl Dev
źródło

Odpowiedzi:

17

Standardowe polecenie, które jest oddla ósemkowej wysypisko (choć z opcji, można zmienić z ósemkowej lub szesnastkowej na dziesiętną ...):

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

Zauważ, że wyświetla wartość bajtu każdego bajtu w pliku. Nie ma to nic wspólnego z ASCII ani żadnym innym zestawem znaków.

Jeśli plik zawiera literę A w danym zestawie znaków, a chciałbyś zobaczyć 65, ponieważ jest to bajt użyty dla litery A w ASCII, musisz wykonać:

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

Aby najpierw przekonwertować ten plik na ascii, a następnie zrzucić odpowiednie wartości bajtów. Na przykład Apple<LF>w EBCDIC-UK byłoby 193 151 151 147 133 37( 301 227 227 223 205 045ósemkowo).

$ 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
źródło
14

hexdump, od, xxd, Czy $YOUR_FAVORITE_LANGUAGEmoże wszystko zrobić.

% 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)
% 
gałązka
źródło
Doskonała odpowiedź, dziękuję. Zwłaszcza hexdump -C. Przyznawany Stephane'owi po prostu dlatego, że jego odpowiedź również została rozwiązana, a on był pierwszy (tylko włosy), ale oba są doskonałe.
Mtl Dev
Jeszcze jedno polecenie: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: źle. Może to uszkodzić plik binarny w systemie Windows
jfs
@ heemayl stdin domyślnie korzysta z trybu tekstowego, który może tłumaczyć znaki nowej linii ( os.linesep-> '\n')
jfs