BASE64エンコーダ開発

相変わらずUNIX-C開発が続いているわけですよ。

今回開発するプログラムは、WebサーバとBasic認証できねばならんので、BASE64エンコードする機能が必要である。だが、UNIXのCライブラリにはこれをやってくれる関数がなく、Webでも探してみたが、いまひとつ良いのがない。仕方ないので自作。

BASE64エンコード自体は非常に単純な処理なので、手早く1時間程度で組んでしまうか、などと思いつつコーディング開始。ところが、なにぶんC言語で開発するのなんて数年ぶりなため、かなり感覚が鈍っており、なかなか思ったように組み上がらない。

ここでC言語初心者向けクイズー。

char *p = "hoge";
printf("%c\n", *p+1);

動作させたらどうなるか?

  1. hと表示される
  2. oと表示される
  3. iと表示される
  4. ogeと表示される
  5. Segmentation Faultになる



・・・正解は「iと表示される」。
単に*と+ではどちらのほうが結合が強いかという話で、当然ながら*のほうが強い。基本中の基本。

だというのに、いやぁ、綺麗さっぱり忘れていてサンプルプログラム書いて走らせるまでわからなかった。四則演算のときは*の方が強かろうが、ポインタのときってどうだったっけ・・・?といった感じ。

そんな調子なんで、当然のように悪戦苦闘しつつ、なんとか120行程度で作り終えた。しかし、ここで一つ問題が発生。これ、どうやってテストしよう?そうだ、Perlにはライブラリが用意されてるはず。こいつで模範解答を出力するスクリプトを組もう。

#!/bin/perl
use MIME::Base64;

print encode_base64($ARGV[0]);

・・・たった三行で出来てしまうのかorz
しかも、mallocもfreeもいらないし。コンパイルする必要すら無いし。その気になればワンライナーで書けるし。わかってはいた。わかってはいたが、俺の苦労ってなんなのだろう?という疑念がぬぐい去れず、どっと疲れがでる。

今回は組み込み系の環境なので、Perlなんていいもん入っていないのである。Cでスクラッチする以外に道が無いのである。しかし、PerlとかPHPみたいな便利な言語に慣れた頭だと、C言語なんてまどろっこしくて使ってられない、というのが本音である。プログラミングの神髄的な所に触れようと思えばC言語が必要になってくるのだが、ヘタレSEの俺は、やっぱり簡単なLL(Lightweight Language)の方がいい。

イア!イア!LL!
イア!イア!Perl