labunix's blog

labunixのラボUnix

「lesc」で文字と2進、8進、10進、16進数への変換、逆変換

■「lesc」で文字と2進、8進、10進、16進数への変換、逆変換

 bashで8bit整数を10進,2進,8進,16進の順に並べてみる
 https://labunix.hateblo.jp/entry/20130923/1379923644

 ASCII文字⇒16進数、16進数⇒10進数、16進数⇒ASCII文字変換
 https://labunix.hateblo.jp/entry/20190405/1554394074

 ASCIIコードの順序の性質と8進数エスケープの関係を整理してみる。
 https://labunix.hateblo.jp/entry/20190721/1563655220

 awkで記号をエスケープしたいときに使う、文字と8進数の一覧
 https://labunix.hateblo.jp/entry/20180801/1533056689

■今まで似たようなことをなんどかやっているので、bashコマンドにしてgitに上げた。

$ curl -s https://raw.githubusercontent.com/labunix/lsec/master/lsec
$ chmod +x lesc
$./lesc

 ,\040
!,\041
",\042
#,\043
$,\044
%,\045
&,\046
',\047
(,\050
),\051
*,\052
+,\053
,,\054
-,\055
.,\056
/,\057
0,\060
1,\061
2,\062
3,\063
4,\064
5,\065
6,\066
7,\067
8,\070
9,\071
:,\072
;,\073
<,\074
=,\075
>,\076
?,\077
@,\100
A,\101
B,\102
C,\103
D,\104
E,\105
F,\106
G,\107
H,\110
I,\111
J,\112
K,\113
L,\114
M,\115
N,\116
O,\117
P,\120
Q,\121
R,\122
S,\123
T,\124
U,\125
V,\126
W,\127
X,\130
Y,\131
Z,\132
[,\133
\,\134
],\135
^,\136
_,\137
`,\140
a,\141
b,\142
c,\143
d,\144
e,\145
f,\146
g,\147
h,\150
i,\151
j,\152
k,\153
l,\154
m,\155
n,\156
o,\157
p,\160
q,\161
r,\162
s,\163
t,\164
u,\165
v,\166
w,\167
x,\170
y,\171
z,\172
{,\173
|,\174
},\175
~,\176
Usage: lesc [-opt] [word|number]

  [-nc] = num2char
  [-cn] = char2num
  [-oc] = oct2char
  [-co] = char2oct
  [-xc] = hex2char
  [-cx] = char2hex
  [-bc] = bit2char
  [-cb] = char2bit

■実は記号はうまく処理出来ないので、デフォルト動作に埋め込んだという経緯がある。
 8進数から記号には変換出来るので、8進数合ってるかな?という確認には使える。
 8進数エスケープの確認には十分なはず。

$ ./lesc | grep '^@'
@,\100

$ ./lesc -oc 047 134 042 134 042 047
[oct2char]
'\"\"'

$ ./lesc | awk -F\, '{if(NF>1 && $1 !~ /[A-Za-z0-9]/){printf "%s ",substr($2,2)}}END{printf "\n"}'
040 041 042 043 044 045 046 047 050 051 052 053  055 056 057 072 073 074 075 076 077 100 133 134 135 136 137 140 173 174 175 176 

$ ./lesc -oc 040 041 042 043 044 045 046 047 050 051 052 053  055 056 057 072 073 074 075 076 077 100 133 134 135 136 137 140 173 174 175 176 
[oct2char]
 !"#$%&'()*+-./:;<=>?@[\]^_`{|}~

■まずは「Hello World」

$ ./lesc Hello World
[num2char]

[char2num]
72 101 108 108 111 32 87 111 114 108 100 
[char2oct]
110 145 154 154 157 040 127 157 162 154 144 
[oct2char]

[char2hex]
0x48 0x65 0x6c 0x6c 0x6f 0x20 0x57 0x6f 0x72 0x6c 0x64 
[hex2char]

[bit2char]

[char2bit]
1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 

$ ./lesc -nc 72 101 108 108 111 32 87 111 114 108 100 
[num2char]
Hello World

$ ./lesc -oc 110 145 154 154 157 040 127 157 162 154 144
[oct2char]
Hello World

$ ./lesc -bc 1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100
[bit2char]
Hello World

■日本語も使えたりする。

$ ./lesc 日本語で入力してみた。 変換できるかな?
[num2char]

[char2num]
26085 26412 35486 12391 20837 21147 12375 12390 12415 12383 12290 12288 22793 25563 12391 12365 12427 12363 12394 65311 
[char2oct]
62745 63454 105236 30147 50545 51233 30127 30146 30177 30137 30002 30000 54411 61733 30147 30115 30213 30113 30152 177437 
[oct2char]

[char2hex]
0x65e5 0x672c 0x8a9e 0x3067 0x5165 0x529b 0x3057 0x3066 0x307f 0x305f 0x3002 0x3000 0x5909 0x63db 0x3067 0x304d 0x308b 0x304b 0x306a 0xff1f 
[hex2char]

[bit2char]

[char2bit]
110010111100101 110011100101100 1000101010011110 11000001100111 101000101100101 101001010011011 11000001010111 11000001100110 11000001111111 11000001011111 11000000000010 11000000000000 101100100001001 110001111011011 11000001100111 11000001001101 11000010001011 11000001001011 11000001101010 1111111100011111 

$ ./lesc -nc 26085 26412 35486 12391 20837 21147 12375 12390 12415 12383 12290 12288 22793 25563 12391 12365 12427 12363 12394 65311
[num2char]
日本語で入力してみた。 変換できるかな?

$ ./lesc -oc 62745 63454 105236 30147 50545 51233 30127 30146 30177 30137 30002 30000 54411 61733 30147 30115 30213 30113 30152 177437
[oct2char]
日本語で入力してみた。 変換できるかな?

$ ./lesc -bc 110010111100101 110011100101100 1000101010011110 11000001100111 101000101100101 101001010011011 11000001010111 11000001100110 11000001111111 11000001011111 11000000000010 11000000000000 101100100001001 110001111011011 11000001100111 11000001001101 11000010001011 11000001001011 11000001101010 1111111100011111
[bit2char]
日本語で入力してみた。 変換できるかな?