labunix's blog

labunixのラボUnix

ASCII文字⇒16進数、16進数⇒10進数、16進数⇒ASCII文字変換


■ASCII文字⇒16進数、16進数⇒10進数、16進数⇒ASCII文字変換

 10進⇒16進⇒ASCII変換
 http://d.hatena.ne.jp/labunix/20130106

 16進⇒10進⇒ASCII変換
 http://d.hatena.ne.jp/labunix/20130108

 ASCII⇒10進⇒16進変換
 http://d.hatena.ne.jp/labunix/20130107

■何の入力チェックもしていないので、かなり雑なmyhexを作成。
 サンプル出力以外に記号は扱えない。2バイト文字とかは今回はスルー。

$ cat myhex 
#!/bin/bash

function usage(){
  echo "Usage: echo \"HelloWorld\" | $(basename $0) [-e|-d|-h]"
  echo "-x : encode from char to hex"
  echo "-c : decode from hex to char"
  echo "-s : sample dec hex char"
  echo "-h : help"
}

if [ $# -eq 0 ];then
  usage
  exit 1
fi

if [ $# -lt 1 ];then
  usage
  exit 1
fi

while getopts "xcdsh" OPT;do
  case $OPT in
    x)
      awk '{for(i=1;i<=length($0);++i)\
        {print "echo $(printf \042%02x\042 \134\042"substr($0,i,1)")"}}' | sh | \
      tr '\n' ' ' | sed -e 's/00/20/g';echo
      ;;
    c)
      tr -d ' ' | awk '{for(i=1;i<=length($0);i+=2)\
        {printf "%c",strtonum("0x"substr($0,i,2))}}END{printf "\n"}' 
      ;;
    d)
      tr -d ' ' | awk '{for(i=1;i<=length($0);i+=2)\
        {printf "%d ",strtonum("0x"substr($0,i,2))}}END{printf "\n"}'
     ;;
    s)
     seq 32 126 | awk 'BEGIN{print "dec hex char"}{printf "%03d  %02x  %c\n",$1,$1,$1}'
      ;;
    h)
      usage
      ;;
  esac
done

■まずは使い方。

$ ./myhex 
Usage: echo "HelloWorld" | myhex [-e|-d|-h]
-x : encode from char to hex
-c : decode from hex to char
-s : sample dec hex char
-h : help

■ASCII -> 16進数変換

$ echo "Hello World" | ./myhex -x
48 65 6c 6c 6f 20 57 6f 72 6c 6416進数 -> ASCII変換

$ echo "Hello World" | ./myhex -x | ./myhex -c
Hello World

■16進数 -> 10進数

$ echo "Hello World" | ./myhex -x | ./myhex -d
72 101 108 108 111 32 87 111 114 108 100 

■サンプルを使って確認

$ ./myhex -s | awk '$3 ~ /[A-z0-9]/ && length($3)==1 && $3 !~ /\[|\]|\\|\^|\_|`/{print $3}' | ./myhex -x
30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 

$ ./myhex -s | awk '$3 ~ /[A-z0-9]/ && length($3)==1 && $3 !~ /\[|\]|\\|\^|\_|`/{print $3}' | ./myhex -x | ./myhex -d
48 49 50 51 52 53 54 55 56 57 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 

$ ./myhex -s | awk '$3 ~ /[A-z0-9]/ && length($3)==1 && $3 !~ /\[|\]|\\|\^|\_|`/{print $3}' | ./myhex -x | ./myhex -c
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

■サンプルとして一覧のおまけ。

$ ./myhex -s
dec hex char
032  20   
033  21  !
034  22  "
035  23  #
036  24  $
037  25  %
038  26  &
039  27  '
040  28  (
041  29  )
042  2a  *
043  2b  +
044  2c  ,
045  2d  -
046  2e  .
047  2f  /
048  30  0
049  31  1
050  32  2
051  33  3
052  34  4
053  35  5
054  36  6
055  37  7
056  38  8
057  39  9
058  3a  :
059  3b  ;
060  3c  <
061  3d  =
062  3e  >
063  3f  ?
064  40  @
065  41  A
066  42  B
067  43  C
068  44  D
069  45  E
070  46  F
071  47  G
072  48  H
073  49  I
074  4a  J
075  4b  K
076  4c  L
077  4d  M
078  4e  N
079  4f  O
080  50  P
081  51  Q
082  52  R
083  53  S
084  54  T
085  55  U
086  56  V
087  57  W
088  58  X
089  59  Y
090  5a  Z
091  5b  [
092  5c  \
093  5d  ]
094  5e  ^
095  5f  _
096  60  `
097  61  a
098  62  b
099  63  c
100  64  d
101  65  e
102  66  f
103  67  g
104  68  h
105  69  i
106  6a  j
107  6b  k
108  6c  l
109  6d  m
110  6e  n
111  6f  o
112  70  p
113  71  q
114  72  r
115  73  s
116  74  t
117  75  u
118  76  v
119  77  w
120  78  x
121  79  y
122  7a  z
123  7b  {
124  7c  |
125  7d  }
126  7e  ~