文字列を、Base64でパスワードをかけてエンコードして、WebサーバーにPOSTして、データベースに保存しています。
保存されている文字列をデコードしようと思ったら、
「Base-64 文字配列の長さが無効です。」
というエラーが発生しました。
スポンサーリンク
言語はVB.netを使っています。
C#.netのおすすめの本があります。
C#文法基本のキ: C#初心者が最初に身に着けるべき30の文法
この本の著者のピーコックアンダーソンという方の出している書籍は全部チェックするとよいです。
Kindle unlimitedだと0円で読むことができます。
.netはなんとなくコードがかけてしまうので、レベルアップしたい人にはおすすめです。
Base-64 文字配列の長さは何文字が正しい?
ちょっと気になったので、脱線しますが、Base64でエンコードした文字列の文字数に関して調べてみました。
エンコードする前は14文字、保存されている文字列は24文字です。
パスワードは6文字にしました。
文字配列の長さが無効ということなのですが、24文字が正しいのかどうかよくわかりません。
ウィキペディアで調べてみました。
- 元データを2進数に変換。
- 6ビットずつに分ける。
- 最後が6ビットにならなかったら、6ビットになるまで0を追加
- 変換表により変換
- 4の倍数にならなかったら、4の倍数になるまで=を追加
ちょっとWikipediaの記述とは違いますが、上のような仕組みです。
最終的な文字列は4の倍数ということなので、24文字というのは問題ないです。
14文字を2進数に変換すると1文字8ビットなので112ビットです。
112=6×18+4なので、「3.」の理屈からすると19文字
「5.」で20文字になります。
ただ、次のリンク先のページを参考にパスワードで暗号化してあるので、実際にエンコードされる直前の文字列は16文字になっていたようです。
16文字を2進数に変換すると1文字8ビットなので128ビットです。
128=6×21+2なので、「3.」の理屈からすると22文字
「5.」で24文字になります。
24文字は正しいことがわかりました。
文字数が正しいのに、「文字配列の長さが無効」?
文字数が正しいのに、「文字配列の長さが無効」が無効というエラーが発生します。
エラーの発生箇所は、「System.Convert.FromBase64String」に文字列を渡して、Byte配列に変換するときです。
FromBase64String メソッドに関して調べてみました。
MSDNでFromBase64String メソッドのページに、
空白文字、Unicode 名、および 16 進コード ポイントがタブ (文字集計、u+0009) 改行 (ライン フィード、u+000 a)、復帰 (キャリッジ リターン, U+000D) と空白 (スペース、U +0 0020)。 空白文字の任意の数が表示できますsすべて空白文字は無視されるためです。
値として解釈されない文字が「=」、末尾の余白に使用します。 末尾s0、1 つまたは 2 つの埋め込み文字で構成できます。
という記述があります。
僕の読解能力のせいなのか、自動翻訳で生成されたものなのか、いまいち理解できませんが、「空白文字は無視される」とかいてあるので、スペースが無視されるのでしょう。
実際に、データベースに保存されている文字列にはスペースがありました。
でも、POSTした文字列にはスペースがありません。
よく見ると。半角の「+」が、半角スペースに変換されています。
半角の「+」はPOSTで送信した時に、半角スペースに変換されてしまうことがあるようです。
原因がわかったので、解決策です。
以下の2通りが簡単ですね。
- デコードするときに、半角スペースを変換する
- POSTするときに「+」をURLエンコードして「%2b」にしてPOSTする。