2

I'd like to convert ASCII code (like -, _, ., etc.) in hexadecimal representation in Unix shell (without bc command). For example, - => %2d.

How can I do it?

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Olivier DUVAL
  • 121
  • 3
  • 8

4 Answers4

9

This works in Bash, Dash (sh), ksh, zsh and ash and uses only builtins:

Edit:

Here is a version of ord that outputs in hex and chr that accepts hex input:

ordhex ()
{
    printf '%x' "'$1"
}

chrhex ()
{
    printf \\x"$1"
}

The original decimal versions:

ord ()
{
    echo -n $(( ( 256 + $(printf '%d' "'$1"))%256 ))
}

Examples (with added newlines):

$ ord ' '
32
$ ord _
95
$ ord A
65
$ ord '*'
42
$ ord \~
126

Here is the corresponding chr:

chr ()
{
    printf \\$(($1/64*100+$1%64/8*10+$1%8))
}

Examples:

$ chr 125
}
$ chr 42
*
$ chr 0 | xxd
0000000: 00                                       .
$ chr 255 | xxd
0000000: ff                                       .
Dennis Williamson
  • 346,391
  • 90
  • 374
  • 439
1
perl -e 'print ord("_"), "\n"'
Beano
  • 7,551
  • 3
  • 24
  • 27
0

The following works in the ksh version I'm using:

chr ()
{
    printf \\x$1
}
0

python -c 'import sys; print "{0:02x}".format(ord(sys.argv[1]))' '_'

or

python -c 'print "{0:02x}".format(ord("_"))'

I agree that it's not the nicest one-liner, but I couldn't resist after seeing the Perl based answer .

Cristian Ciupitu
  • 20,270
  • 7
  • 50
  • 76