Строка Base64, бросающая ошибку недопустимого символа

попробуйте очистить свой проект, а также папку bin и obj. Затем восстановите и перестройте решение, выполнив

dotnet restore
dotnet rebuild

, и протестируйте решение.

Если это не работает, я предлагаю вам явно включить System.ComponentModel.Annotations пакет nuget в ваш основной .Net Framework v4.6.1 и повторить попытку

14
задан Brandon 2 April 2009 в 19:24
поделиться

3 ответа

Вы говорите

Строка точно, что было записано в файл (с добавлением "\0" в конце, но я не думаю, что даже делает что-либо).

На самом деле это действительно делает что-то (это заставляет Ваш код бросать a FormatException: "Недопустимый символ в Основе 64 строки"), потому что Convert.FromBase64String не полагает "\0" быть допустимым символом Base64.

  byte[] data1 = Convert.FromBase64String("AAAA\0"); // Throws exception
  byte[] data2 = Convert.FromBase64String("AAAA");   // Works

Решение: Избавьтесь от нулевого завершения. (Возможно, звоните .Trim("\0"))

Примечания:

Документы MSDN для Convert.FromBase64String скажите, что это бросит a FormatException когда

Длина s, игнорируя пробельные символы, не является нулем или несколько из 4.

- или -

Формат s недопустим. s содержит неоснову 64 символа, больше чем два дополнительных символа или цветной пробел среди дополнительных символов.

и это

Основой 64 цифры в порядке возрастания от нуля являются символы верхнего регистра к 'Z', символы нижнего регистра к 'z', цифры '0' к '9', и символы '+' и '/'.

16
ответ дан 1 December 2019 в 13:22
поделиться

Если удаление \0 от конца строки невозможно, можно добавить собственный символ для каждой строки, которую Вы кодируете и удаляете его на декодировании.

0
ответ дан 1 December 2019 в 13:22
поделиться

Позволяется ли пустой символ или не действительно зависит от base64 рассматриваемого кодека. Учитывая неопределенность стандарта Base64 (нет никакой авторитетной точной спецификации), много реализаций просто проигнорировали бы его как пробел. И затем другие могут отметить его как проблему. И самые с ошибками не заметили бы и счастливо попытаются декодировать его... :-/

Но это звучит, c# реализации не нравится он (который является одним допустимым подходом), поэтому при удалении, это помогает, это должно быть сделано.

Один незначительный дополнительный комментарий: UTF-8 не является требованием, ISO-8859-x иначе латиноамериканец, и 7-разрядный ASCII работал бы также. Это, потому что Base64 был специально предназначен, чтобы только использовать 7-разрядное подмножество, которое работает со всем 7-разрядным ASCII совместимая кодировка.

3
ответ дан 1 December 2019 в 13:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: