Convert.FromBase64String () выдает ошибку «недопустимая строка Base-64»

У меня есть ключ в кодировке Base64.

При попытке декодирования я получаю следующую ошибку. Ошибка выдает byte[] todecode_byte = Convert.FromBase64String(data);

Error in base64DecodeThe input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.

Я использую метод ниже, чтобы декодировать это:

public string base64Decode(string data)
{
    try
    {
        System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
        System.Text.Decoder utf8Decode = encoder.GetDecoder();

        byte[] todecode_byte = Convert.FromBase64String(data); // this line throws the exception

        int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);
        char[] decoded_char = new char[charCount];
        utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0);
        string result = new String(decoded_char);
        return result;
    }
    catch (Exception e)
    {
        throw new Exception("Error in base64Decode" + e.Message);
    }
}

Отправьте строку, которую вы пытаетесь декодировать (если она не слишком большая).

Matthew Watson 25.05.2018 10:23

Какое исключение выбрасывается и откуда оно выброшено?

Dragonthoughts 25.05.2018 10:24

Если он огромный, используйте PasteBin.

SᴇM 25.05.2018 10:25

Ошибка, кажется, предполагает, что ваш ввод неверен. Вы проверили, что ваша строка ввода верна?

Micha Wiedenmann 25.05.2018 10:25

Возможно, попробуйте просмотреть необработанную строку base64 (например, установить точку останова и установить смотреть) и найти символы, отличные от base 64, более двух символов заполнения или недопустимый символ среди символов с заполнением. Не знаю, просто догадка.

John Wu 25.05.2018 10:26

Кроме того, не совсем понятно, почему вы не используете Encoding.UTF8.GetString(todecode_byte) только после декодирования base64. Но кроме того, что часть base64, конечно, не работает.

Jon Skeet 25.05.2018 10:26

Возможно, проверьте ввод и убедитесь, что вы предоставили только base64, а не, например, строку json, содержащую значение base64.

John Wu 25.05.2018 10:29
- недопустимый символ. Откуда у тебя струна? Возможно, вам потребуется изменить символы - на + или /. Также он должен быть кратным 4 символам. Если я не ошибся, ваша строка состоит из 43 символов.
Matthew Watson 25.05.2018 10:51

Мы получаем это из нашего внутреннего восходящего интерфейса, где утверждается, что строка является URL-адресом в кодировке Base64. Да длина 43? Вы уверены, что ключ не закодирован в формате Base64 URL?

akshay 25.05.2018 10:58

Вы можете добавить символы =, чтобы сделать его правильной длины (т. Е. Кратной 4), но это по-прежнему оставляет проблему с недопустимым символом -. Вам нужно знать метод кодирования, который они использовали, чтобы вы знали, как исправить это для .Net.

Matthew Watson 25.05.2018 11:04

Спасибо Мэтью за ваши комментарии. Строка ввода неверна и вызвала эту проблему.

akshay 25.05.2018 11:13

У меня такая же проблема, за исключением того, что моя строка исходит от AESEncryption

Chillin' 22.02.2019 17:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
12
19 478
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваша base64-String недействительна. Он содержит недопустимый -.

static void Main()
{
    string tmp = "eL78WIArGQ7bC44Ozr0yvUBkz9oc5YlsENYJilInSP= = ";
    byte[] tmp2 = Convert.FromBase64String(tmp);
}

-> Убран минус -> Добавлены два символа-заполнителя "="

Это работает. Это означает, что строка ввода, которую я использовал, неверна. Спасибо.

akshay 25.05.2018 11:12

Минус просто не убрать! Вы меняете результаты. Вам нужно заменить его правильным символом.

Matthew Watson 25.05.2018 11:13

Верно. Этот образец работает, но меняет результаты

akshay 25.05.2018 11:24

Я только хотел показать проблему. Я уверен, что все знают, что интерпретация двоичных данных невозможна, если вы игнорируете некоторые байты;). @akshay: В любом случае - получи правильный ввод

kara 25.05.2018 11:31
Ответ принят как подходящий

Итак, есть две проблемы:

  1. Длина вашей строки не кратна 4. Его необходимо дополнить до кратного 4 с помощью символов '='.
  2. Похоже, это формат базы 64, используемый для URL-адресов и т.п., "измененный Base64 для URL". Здесь используется - вместо + и _ вместо /.

Итак, чтобы исправить это, вам нужно поменять местами - на + и _ на / и добавить его, например:

public static byte[] DecodeUrlBase64(string s)
{
    s = s.Replace('-', '+').Replace('_', '/').PadRight(4*((s.Length+3)/4), '=');
    return Convert.FromBase64String(s);
}

Другие вопросы по теме