LoginSignup
8
3

More than 5 years have passed since last update.

ASCIIコードを調べるUNIXコマンドがあった気がしたんだけど思い出せないからもう作っちゃえばいいかと…

Last updated at Posted at 2018-03-01

目的

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
8
3
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3