Чтобы отладить подобную проблему, я обычно пишу несколько тестов или создаю консольное приложение, чтобы наблюдать за переменными, когда они меняются от функции к функции.
Один из возможных сценариев сбоя декодирования base64 - это, если вход декодера имеет код HTMLE. Это обычно происходит, когда вы передаете зашифрованную строку в URL, например. Он будет автоматически кодироваться в формате HTML, а затем иногда может, а иногда и не может быть декодирован, в зависимости от символов, содержащихся в закодированном выводе.
Вот простое консольное приложение, чтобы продемонстрировать это.
class Program
{
static void Main(string[] args)
{
string input = "testaa";
TestEncodeDecode("test");
TestEncodeDecode("testa");
TestEncodeDecode("testaa");
Console.ReadLine();
}
private static void TestEncodeDecode(string input)
{
string encoded = Encode(input);
Console.WriteLine($"Encoded: {encoded}");
string htmlEncoded = WebUtility.UrlEncode(encoded);
Console.WriteLine($"htmlEncoded: {htmlEncoded}");
string decodedString = Decode(htmlEncoded);
Console.WriteLine($"Decoded: {decodedString}");
Console.WriteLine();
}
private static string Decode(string htmlEncoded)
{
try
{
byte[] decoded = Convert.FromBase64String(htmlEncoded);
return Encoding.ASCII.GetString(decoded);
}
catch(Exception)
{
return "Decoding failed";
}
}
private static string Encode(string input)
{
byte[] bytes = Encoding.ASCII.GetBytes(input);
using (var stream = new MemoryStream())
{
stream.Write(bytes);
return Convert.ToBase64String(stream.ToArray());
}
}
}
Вы увидите, что первые два аргумента ("test" и "testa") не декодируются, но третий ("testaa") будет успешным.
Чтобы исправить это, измените метод Decode следующим образом:
private static string Decode(string htmlEncoded)
{
try
{
string regularEncodedString = WebUtility.UrlDecode(htmlEncoded);
byte[] decoded = Convert.FromBase64String(regularEncodedString);
return Encoding.ASCII.GetString(decoded);
}
catch(Exception)
{
return "Decoding failed";
}
}