[解決済み] Base64でエンコードされた文字列が有効かどうかを確認する方法
質問
C# で、文字列が Base 64 エンコードされているかどうかを確認する方法は、単に変換を試みてエラーが発生するかどうかを確認する以外にあるでしょうか? 私はこのようなコードコードを持っています。
// Convert base64-encoded hash value into a byte array.
byte[] HashBytes = Convert.FromBase64String(Value);
値が有効なベース64文字列でない場合に発生する "Invalid character in a Base-64 string" という例外を回避したいのです。この値がベース64文字列でないこともあると思うので、例外を処理するのではなく、単にチェックしてfalseを返したいのです。 Convert.FromBase64String関数を使用する前にチェックする方法はありますか?
ありがとうございます。
更新しました。
たくさんのご回答ありがとうございました。 この拡張メソッドを使用すると、文字列が例外なしに Convert.FromBase64String を通過することが確認できます。 .NETでは、ベース64に変換する際に、すべての末尾および末尾のスペースを無視するようなので、"1234"は有効で、" 1234 "も有効です。
public static bool IsBase64String(this string s)
{
s = s.Trim();
return (s.Length % 4 == 0) && Regex.IsMatch(s, @"^[a-zA-Z0-9\+/]*={0,3}$", RegexOptions.None);
}
テストと例外のキャッチのパフォーマンスについて疑問をお持ちの方のために説明すると、このベース64の場合、ある長さに達するまでは例外をキャッチするよりもチェックする方が速い場合がほとんどです。長さが小さければ小さいほど、より速くなります。
私の非常に非科学的なテストでは 10000回の繰り返しで、文字長100000~110000の場合、最初にテストする方が2.7倍速かったです。
文字数1~16文字で1000回、合計16000回のテストを行った場合、10.9倍速くなりました。
例外を利用したテストが有利になるタイミングがあるのは確かです。ただ、それがどの時点なのかはわかりません。
どのように解決するのか?
更新情報 : C#の新しいバージョンでは、より良い代替手段があります。以下のTomasによる回答を参照してください。
Base64の文字列を認識するのはとても簡単です。
'A'..'Z', 'a'..'z', '0'..'9', '+', '/'
しかし、これらを比較するのではなく、例外が発生しても無視したほうがよいでしょう。
関連
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み] 文字列が有効な数値であるかどうかを確認するにはどうすればよいですか?
-
[解決済み] base64文字列をエンコード、デコードするにはどうしたらいいですか?
-
[解決済み] HTMLでBase64画像を表示する方法
-
[解決済み] バイナリデータをJSON文字列で。Base64より優れたもの
-
[解決済み] JavaScriptで画像をBase64文字列に変換するにはどうすればよいですか?
-
[解決済み】Node.jsでBase64エンコードを行うにはどうすればよいですか?
-
[解決済み】JavaScriptで文字列をBase64にエンコードするにはどうすればいいですか?
-
[解決済み】JavaScriptでBase64文字列からBLOBを作成する場合
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C#で四捨五入する方法
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?