目的
ASCIIコードを突然調べたくなることって、ありますよね!
え、ない?
あーそうすか…。
いや、突然あるんですが、いちいちhexdumpやらhdするのも鬱陶しいし、そんなUNIX系のコマンドがあった気がするだけれど、このぐらいなら30分仕事かと思って昼休みに書いてみた感じです。
あと最近Qiitaにも何も書いてないので、keep alive的な投稿として。
[2018/03/11追記] ちょいちょいとオプション加えました。末尾に記載しています。
ソース
GitHubにあげてあります。このぐらいならGistでいい気はするけれど。
コンパイル・使い方
README.mdに書いてあります。
コンパイル
Cコンパイラ(cc)があればなんでも大丈夫です。ClangでもGCCでも、おそらくTCCでもLCCでも問題ないでしょう。printf()とputchar()が使えればとりあえず大丈夫のはず。
$ cc -o asc asc.c
実行ファイルascは、$HOME/binとか/usr/local/binとか、自由にコピーして使うでもよし、./ascでカレントディレクトリから使うもよし、自由。
使い方
一覧表の出力
0x20(スペース)から0x7Fまでの範囲のASCIIコード表を表示する。
$ asc
0 1 2 3 4 5 6 7 8 9 A B C D E F
2 ! " # $ % & ' ( ) * + , - . /
3 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4 @ A B C D E F G H I J K L M N O
5 P Q R S T U V W X Y Z [ \ ] ^ _
6 ` a b c d e f g h i j k l m n o
7 p q r s t u v w x y z { | } ~
知りたい文字だけ表示する
「X」だけ知りたい場合は、以下の通り。
$ asc X
X: hex=0x58, dec=88
連続した文字を知るなら、以下の通り。
$ asc x Y z
x: hex=0x78, dec=120
Y: hex=0x59, dec=89
z: hex=0x7a, dec=122
ソースコード
一覧表出力部分
一覧表出力は引数がない場合に1関数show_list()に抜き出して処理している。
32(0x20)から0x7F(127)までの範囲で16個1行(i += 16)で表示させている。
void show_list()
{
int i, j;
printf(" 0 1 2 3 4 5 6 7 8 9 A B C D E F\n");
for (i = 32; i < 128; i += 16) {
printf("%X ", i / 16);
for (j = i; j < i + 16; j++) {
printf("%c ", j);
}
putchar('\n');
}
}
引数がない場合、というのはmain()関数内の以下の部分。
表示したらexit(0)でプログラムを抜けている。
if (argc < 2) {
show_list();
exit(0);
}
指定文字のコード出力
コマンドライン引数の指定があった場合は、以下のように個別の文字を都度1行ずつ出力している。
for (i = 1; i < argc; i++) {
printf("%c: hex=0x%02x, dec=%d\n", *argv[i], *argv[i], *argv[i]);
}
[追記] オプション追加
2つほどオプションつけてみました。ソースコードはGitHubにあります。
-lオプションは、出力を1行にするものです。
たとえばプログラム書いてて文字列が欲しい場合もあるので、そういうとき用のやつです。もう完全に俺用です。
$ asc -l
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
-xオプションも追加してみました。
これは @nakataSyunsuke さんの書かれた「(メモ) シェル芸: 数字のASCIIコードを文字に変換する」の記事を拝見して、ASCIIコードから文字を表示も確かにあるといいねぇ〜、というノリで追加しました。
こんな感じで使えます。10進数と16進数は混在可能です。
$ asc -x 66 0x41 68 0x20 0x42 79 89
B: hex=0x42, dec=66
A: hex=0x41, dec=65
D: hex=0x44, dec=68
: hex=0x20, dec=32
B: hex=0x42, dec=66
O: hex=0x4f, dec=79
Y: hex=0x59, dec=89
$ asc -lx 66 0x41 68 0x20 0x42 79 89
BAD BOY