パスワード分割区切り関数 ソースと解説
そろそろマイナンバーカード用パスワードを決定しようと思っているのですが、長いパスワードを覚えるのは至難の業です。さらに、画面に表示されたこのようなパスワードをきちんと間違えずに入力をすることができるかどうか。
U6PABEV5UC2UBAEU
そういえば、クレジットカード番号も16桁ですが、これは4桁ずつ区切ってありますね。そこで、このように表示できればいいのではないでしょうか。
U6PA-BEV5-UC2U-BAEU
おもえば、いろいろなソフトウエアのインストール時に入力する認証キーなども、32桁もあるけれど、4桁ずつに区切ってあるので、間違えずに入力することができます。
というわけで、今回は長いパスワードを4桁ずつに分割して、間に区切り文字を入れるルーチンを作ってみます。
プログラム言語 十進BASIC
パソコンで簡単に作れる物というと、以前はDOSベースのBASICがありましたが、今や、Windowsの時代です。そこで、以前も使ったことのある。十進BASICを使うことにしました。もちろんこれもコンパイル不要のインタープリター型です。
これは十進BASICのホームページから無料でダウンロードできます。
文法は十進BASICヘルプ Windows版で解説されています。
要件
- 長い文字列を4桁ずつに分割します。
- 区切り文字は「-」とします。
- 4で割り切れない場合、余りの文字列も最後に表示します。
十進BASICの外部関数としますから、いろいろな十進BASICでそのまま使えます。というのは、この外部関数内の変数はローカル変数であり、グローバル変数とはならないので、呼び出し側の変数とは完全に独立しているからです。
プログラム・ソース
解説
引数として渡された文字列を4文字ずつに分割する方法を表にして観ました。
- nagasa : 引数として渡された文字列の長さ
- p$ : 4文字ずつ格納する配列
- a : 4文字が何個できるか
- b : 余りの文字数
- j : 区切りの最初の文字位置 j=4*(i-1)+1
文字位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | … | j | j+1 | j+2 | j+3 | … | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
配列 | p$(1) | p$(2) | … | p$(i) | … | p$(a) |
文字位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | … | j | j+1 | j+2 | j+3 | … | nagasa-b | … | nagasa | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
配列 | 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$ |
このように、一般的には区切り文字と分割した文字列がセットで加わりますが、一回目だけは、先頭に区切り文字が入るとじゃまなので、これを避けています。
実行例
前回の汎用パスワード発生プログラムに追加して実行してみます。
具体的な使用方法としては、以下の三つだけです。
- 初期処理で、この外部関数を使う宣言をします。 DECLARE EXTERNAL FUNCTION kugiri$
- ソースの最後に、この関数を貼り付けます。
- 呼び出す場合は引数を忘れずに書きます。 PRINT "区切形式 ="; kugiri$(pwd$)
実行画面はこのようになります。
別バージョン
この解説文をかいていたら、別バージョンを思いつきました。それが、なんとも簡単なんです。
なぜ簡単かというと、一旦分割してから、区切り文字をはさんで結合するという二段階の手順を踏まず、たった一階の手順で完了するからです。
- 文字列の先頭から一文字ずつ、結果の文字列に書き込んでいく。
- 初回以外で、その順番が(4の倍数+1)である時には、区切り文字を先に追加しておく。
たったこれだけです。以下にそのソースを表示します。
もはや、解説も不要なほど簡潔ですし、実行結果は、まったく変わりません。
おまけ
2021年6月20日 記