1. ホーム
  2. c#

[解決済み] Base64でエンコードされた文字列が有効かどうかを確認する方法

2022-05-05 23:58:13

質問

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', '+', '/' しかし、これらを比較するのではなく、例外が発生しても無視したほうがよいでしょう。