B-6 ASCIIコード−Ord関数とChr関数−

【練習問題】

コンピュータの内部ではすべての情報が数値で表されています。ですから、例えば「D」という文字もコンピュータは数値で把握しているのです。この数値を ASCII (アスキー) コードといいます。これは、要するに英数字や「=」、「*」等の記号に数字を割り当てたものです。例えばアルファベットの A〜Z はASCIIコードの 65〜90 に対応しています。

それでは、入力した文字のASCII コードを表示するプログラムを作ってみましょう。

まずは、次のようにコンポーネントを配置してください。

コンポーネント Name プロパティ
「文字」エディット EditOrigin
「コード化」ボタン ButtonEncrypt
スピンエディット SpinEditCode
「文字化」ボタン ButtonDecode

 

次に、ButtonEncryptClick に次のように書いてください。

procedure TForm1.ButtonEncryptClick(Sender: TObject);
begin
  SpinEditCode.Value := Ord(EditOrigin.Text[1]);
end;

最初の1文字だけを調べるので、「EditOrigin.Text[1]」でいいですね。これの ASCII コードを求めるには、上記のように Ord 関数を使います。Ord 関数は、Order (順序) の略で、1文字を受け取ってそれに対応する ASCII コード表中の順番、つまりASCIIコードを返す関数です。「D」の ASCII コードはちゃんと 68 と出ましたか?

【基礎課題 B-7】

今度は、文字化ボタンを押すと ASCII コードを文字に戻すプログラムを作ってみましょう。

この場合には、Chr という関数を利用します。Chr 関数は、いわば Ord 関数の逆関数であり、ASCII コードを受け取って対応する文字を返します。つまり、

Chr(68)

は「D」となる訳です。

【基礎課題 B-8】

映画「2001年宇宙の旅」に出てくるコンピュータの名前「HAL」が「IBM」の各アルファベットを1文字ずつ (前に) ずらして作られたものであることは有名な話です。このようにアルファベットを1文字ずつ (または数文字ずつ) ずらして作る暗号は「シーザ暗号」と呼ばれ、古代ローマ帝国において使われていたと言われています。

ここでは、次のように「暗号化」ボタンを押すと入力文をシーザ暗号化し、

逆に「解読」ボタンを押すと暗号を解読する (元に戻す) プログラムを作ります。

ここでは、ASCIIコードを用い、ASCIIコードを一つ後ろにずらすことで入力文をシーザ暗号化するプログラムを考えます。  まずコンポーネントを下のように配置してください。

コンポーネント Name プロパティ
「原文」エディット EditOrigin
「暗号化」ボタン ButtonEncrypt
「解読」ボタン ButtonDecrypt
「暗号文」エディット EditCrypt

このプログラムは、本章の学習内容の理解度を確認する総合問題です。以下の空欄を埋めて[暗号化]および[解読]ボタンのイベントハンドラを完成させてください。

解説

  1. 今の場合、暗号化の処理は該当文字のASCIIコードを一つ後ろにずらすことです。逆に解読処理はASCIIコードを一つ前にずらす (戻す) ことになります。
  2. 暗号化および解読共に、該当Edit欄の文字の長さだけ@の処理を繰り返します。
  3. 暗号化および解読した文字は順次Mojiという文字列型変数に連結させています。これにより、処理結果がMojiに格納されることになります。

【応用課題 B-4】

【基礎課題B-8】のプログラムを拡張して、任意のずらし幅で暗号化および解読できるプログラムを作成してください。 つまり、下のようにずらし幅を入力できるようにするのです。

作成したら、このプログラムを用いて上のように「¥rx#duh#juhdw$」という暗号文を解読してください。これは、ずらし幅が分かっていない暗号文です。 はたして、暗号が解けるずらし幅はいくつなのでしょうか?