会社行きたくなかったんです。

自由になりたくて会社辞めました

IT プログラミング

Base64にエンコードしてPOSTした文字列がデコードできない。

更新日:

文字列を、Base64でパスワードをかけてエンコードして、WebサーバーにPOSTして、データベースに保存しています。

保存されている文字列をデコードしようと思ったら、

「Base-64 文字配列の長さが無効です。」

というエラーが発生しました。

スポンサーリンク

言語はVB.netを使っています。

C#.netのおすすめの本があります。
C#文法基本のキ: C#初心者が最初に身に着けるべき30の文法
この本の著者のピーコックアンダーソンという方の出している書籍は全部チェックするとよいです。
Kindle unlimitedだと0円で読むことができます。

.netはなんとなくコードがかけてしまうので、レベルアップしたい人にはおすすめです。

Base-64 文字配列の長さは何文字が正しい?

ちょっと気になったので、脱線しますが、Base64でエンコードした文字列の文字数に関して調べてみました。

エンコードする前は14文字、保存されている文字列は24文字です。

パスワードは6文字にしました。

文字配列の長さが無効ということなのですが、24文字が正しいのかどうかよくわかりません。

ウィキペディアで調べてみました。

Base64(Wikipedia)

  1. 元データを2進数に変換。
  2. 6ビットずつに分ける。
  3. 最後が6ビットにならなかったら、6ビットになるまで0を追加
  4. 変換表により変換
  5. 4の倍数にならなかったら、4の倍数になるまで=を追加

ちょっとWikipediaの記述とは違いますが、上のような仕組みです。

最終的な文字列は4の倍数ということなので、24文字というのは問題ないです。

14文字を2進数に変換すると1文字8ビットなので112ビットです。

112=6×18+4なので、「3.」の理屈からすると19文字

「5.」で20文字になります。

ただ、次のリンク先のページを参考にパスワードで暗号化してあるので、実際にエンコードされる直前の文字列は16文字になっていたようです。

パスワードで文字列を暗号化する(DOBON.NET)

16文字を2進数に変換すると1文字8ビットなので128ビットです。

128=6×21+2なので、「3.」の理屈からすると22文字

「5.」で24文字になります。

24文字は正しいことがわかりました。

文字数が正しいのに、「文字配列の長さが無効」?

文字数が正しいのに、「文字配列の長さが無効」が無効というエラーが発生します。

エラーの発生箇所は、「System.Convert.FromBase64String」に文字列を渡して、Byte配列に変換するときです。

FromBase64String メソッドに関して調べてみました。

MSDNでFromBase64String メソッドのページに、

sbase64 の数字、空白文字、および末尾の埋め込み文字で構成されます。 0 から昇順に、base64 の数字は、"Z"、文字の小文字を大文字の文字"A"から"z"、数字の「0」~「9」、"a"と、シンボル「+」と「/」です。
空白文字、Unicode 名、および 16 進コード ポイントがタブ (文字集計、u+0009) 改行 (ライン フィード、u+000 a)、復帰 (キャリッジ リターン, U+000D) と空白 (スペース、U +0 0020)。 空白文字の任意の数が表示できますsすべて空白文字は無視されるためです。
値として解釈されない文字が「=」、末尾の余白に使用します。 末尾s0、1 つまたは 2 つの埋め込み文字で構成できます。

という記述があります。

僕の読解能力のせいなのか、自動翻訳で生成されたものなのか、いまいち理解できませんが、「空白文字は無視される」とかいてあるので、スペースが無視されるのでしょう。

実際に、データベースに保存されている文字列にはスペースがありました。

でも、POSTした文字列にはスペースがありません。

よく見ると。半角の「+」が、半角スペースに変換されています。

半角の「+」はPOSTで送信した時に、半角スペースに変換されてしまうことがあるようです。

原因がわかったので、解決策です。

以下の2通りが簡単ですね。

  • デコードするときに、半角スペースを変換する
  • POSTするときに「+」をURLエンコードして「%2b」にしてPOSTする。

-IT, プログラミング

Copyright© 自由になりたくて会社辞めました , 2024 AllRights Reserved Powered by AFFINGER4.