パスワード分割区切り関数 ソースと解説

そろそろマイナンバーカード用パスワードを決定しようと思っているのですが、長いパスワードを覚えるのは至難の業です。さらに、画面に表示されたこのようなパスワードをきちんと間違えずに入力をすることができるかどうか。

U6PABEV5UC2UBAEU

そういえば、クレジットカード番号も16桁ですが、これは4桁ずつ区切ってありますね。そこで、このように表示できればいいのではないでしょうか。

U6PA-BEV5-UC2U-BAEU

おもえば、いろいろなソフトウエアのインストール時に入力する認証キーなども、32桁もあるけれど、4桁ずつに区切ってあるので、間違えずに入力することができます。

というわけで、今回は長いパスワードを4桁ずつに分割して、間に区切り文字を入れるルーチンを作ってみます。

プログラム言語 十進BASIC

パソコンで簡単に作れる物というと、以前はDOSベースのBASICがありましたが、今や、Windowsの時代です。そこで、以前も使ったことのある。十進BASICを使うことにしました。もちろんこれもコンパイル不要のインタープリター型です。

これは十進BASICのホームページから無料でダウンロードできます。

文法は十進BASICヘルプ Windows版で解説されています。

要件

  1. 長い文字列を4桁ずつに分割します。
  2. 区切り文字は「-」とします。
  3. 4で割り切れない場合、余りの文字列も最後に表示します。

十進BASICの外部関数としますから、いろいろな十進BASICでそのまま使えます。というのは、この外部関数内の変数はローカル変数であり、グローバル変数とはならないので、呼び出し側の変数とは完全に独立しているからです。

プログラム・ソース

解説

引数として渡された文字列を4文字ずつに分割する方法を表にして観ました。

  • nagasa : 引数として渡された文字列の長さ
  • p$ : 4文字ずつ格納する配列
  • a : 4文字が何個できるか
  • b : 余りの文字数
  • j : 区切りの最初の文字位置 j=4*(i-1)+1
[余りが無い場合(長さが4の倍数)]
文字位置12345678jj+1j+2j+3
配列p$(1)p$(2)p$(i)p$(a)
[余りがある場合]
文字位置12345678jj+1j+2j+3nagasa-bnagasa
配列p$(1)p$(2)p$(i)p$(a)nokori$

次に、分割した文字列を区切り文字で結合する様子を表してみました。

kekka$
1回目p$(1)
2回目p$(1)-p$(2)
i 回目p$(1)-p$(2)-p$(i)
a 回目p$(1)-p$(2)-p$(i)-p$(a)
残りがある場合p$(1)-p$(2)-p$(i)-p$(a)-nokori$

このように、一般的には区切り文字と分割した文字列がセットで加わりますが、一回目だけは、先頭に区切り文字が入るとじゃまなので、これを避けています。

実行例

前回の汎用パスワード発生プログラムに追加して実行してみます。

具体的な使用方法としては、以下の三つだけです。

  1. 初期処理で、この外部関数を使う宣言をします。 DECLARE EXTERNAL FUNCTION kugiri$
  2. ソースの最後に、この関数を貼り付けます。
  3. 呼び出す場合は引数を忘れずに書きます。 PRINT "区切形式 ="; kugiri$(pwd$)


実行画面はこのようになります。

別バージョン

この解説文をかいていたら、別バージョンを思いつきました。それが、なんとも簡単なんです。

なぜ簡単かというと、一旦分割してから、区切り文字をはさんで結合するという二段階の手順を踏まず、たった一階の手順で完了するからです。

  1. 文字列の先頭から一文字ずつ、結果の文字列に書き込んでいく。
  2. 初回以外で、その順番が(4の倍数+1)である時には、区切り文字を先に追加しておく。

たったこれだけです。以下にそのソースを表示します。

もはや、解説も不要なほど簡潔ですし、実行結果は、まったく変わりません。

おまけ



2021年6月20日 記