попробуйте очистить свой проект, а также папку bin и obj. Затем восстановите и перестройте решение, выполнив
dotnet restore
dotnet rebuild
, и протестируйте решение.
Если это не работает, я предлагаю вам явно включить System.ComponentModel.Annotations
пакет nuget в ваш основной .Net Framework v4.6.1 и повторить попытку
Вы говорите
Строка точно, что было записано в файл (с добавлением "\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', и символы '+' и '/'.
Если удаление \0 от конца строки невозможно, можно добавить собственный символ для каждой строки, которую Вы кодируете и удаляете его на декодировании.
Позволяется ли пустой символ или не действительно зависит от base64 рассматриваемого кодека. Учитывая неопределенность стандарта Base64 (нет никакой авторитетной точной спецификации), много реализаций просто проигнорировали бы его как пробел. И затем другие могут отметить его как проблему. И самые с ошибками не заметили бы и счастливо попытаются декодировать его... :-/
Но это звучит, c# реализации не нравится он (который является одним допустимым подходом), поэтому при удалении, это помогает, это должно быть сделано.
Один незначительный дополнительный комментарий: UTF-8 не является требованием, ISO-8859-x иначе латиноамериканец, и 7-разрядный ASCII работал бы также. Это, потому что Base64 был специально предназначен, чтобы только использовать 7-разрядное подмножество, которое работает со всем 7-разрядным ASCII совместимая кодировка.