Что может вызвать Base64 декодирование, бросить FormatException - PullRequest
0 голосов
/ 31 октября 2018

Я использую C # и .NET для кодирования и декодирования строки base64. Ниже приведены фрагменты моего кода:

Base64 кодировка:

using (var stream = new MemoryStream())
        …...
    return Convert.ToBase64String(stream.ToArray());
}

Base64 декодирование

byte[] bytes = Convert.FromBase64String(messageBody);

Мой код дает сбой в 99% случаев с вероятностью 1% успеха. Трассировка стека выглядит следующим образом:

5xx Возврат ошибки: System.FormatException: Входные данные не являются допустимой строкой Base-64, так как она содержит неосновной 64-символ, более двух символов заполнения или недопустимый символ среди символов заполнения. в System.Convert.FromBase64_ComputeResultLength (Char inputPtr, Int32 inputLength) в System.Convert.FromBase64CharPtr (Char * inputPtr, Int32 inputLength) в System.Convert.FromBase64String (String s) *

Кто-нибудь знает, что может привести к сбою декодирования base64? Мои методы кодирования и декодирования симметричны, и я действительно не понимаю, что может быть основной причиной этой проблемы?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Спасибо за все ваши ответы.

Оказалось, что все еще есть старые сообщения в формате Json, которые раньше не доставлялись и продолжали повторяться в нашей системе; однако новое изменение кода нашей принимающей стороны было развернуто, и наша принимающая сторона начинает ожидать сообщения в формате protobuf, что приводит к ошибке десериализации при получении старых сообщений формата Json.

0 голосов
/ 31 октября 2018

Чтобы отладить подобную проблему, я обычно пишу несколько тестов или создаю консольное приложение, чтобы наблюдать за переменными, когда они меняются от функции к функции.

Один из возможных сценариев сбоя декодирования 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";
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...