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

Я продолжаю получать ошибку недопустимого символа Base64, хотя я не должен.

программа берет XML-файл и экспортирует его в документ. Если пользователь хочет, он будет сжимать файл, а также. Сжатие работает нормально и возвращает строку Base64, которая кодируется в UTF-8 и записывается в файл.

когда пришло время перезагрузить документ в программу, я должен проверить, сжат ли он или нет, код просто:

byte[] gzBuffer = System.Convert.FromBase64String(text);
return "1F-8B-08" == BitConverter.ToString(new List<Byte>(gzBuffer).GetRange(4, 3).ToArray());

Он проверяет начало строки, чтобы увидеть, есть ли в ней код GZips.

Так вот, все тесты работают. Я беру строку, сжимаю ее, распаковываю и сравниваю с оригиналом. Проблема в том, когда я получаю строку, возвращенную из набора записей ADO. Строка-это именно то, что было записано в файл (с добавлением "" в конце, но я не думаю, что даже что-то делает, даже обрезается, все равно бросает). Я даже скопировал и вставил всю строку в метод теста и сжать / распаковать. Работать отлично.

тесты пройдут, но код не будет использовать ту же самую строку? Единственное отличие-вместо того, чтобы просто объявлять обычную строку и передавать ее, я получаю одну, возвращенную из набора записей.

любые идеи о том, что я делаю не так?

5 ответов


скажете вы

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

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

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

решение: избавиться от нуля прекращение. (может вызвать .Trim(""))

Примечания:

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

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

или

недопустимый формат s. s содержит неосновные 64 символа, больше более двух символов заполнения или не-пробельный символ между набивка письмена.

и

базовые 64 цифры в порядке возрастания от нуля-символы верхнего регистра 'A' to 'Z', строчные буквы 'a' к "z", цифрам от " 0 " до " 9 " и символы '+' и '/'.


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

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

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


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


один из способов преобразования Base64 из строки заключается в том, что некоторые функции преобразования используют предыдущие "данные:image/jpg;base64", а другие принимают только фактические данные.


string stringToDecrypt = HttpContext.Current.Request.QueryString.ToString()

//изменение string stringToDecrypt = HttpUtility.UrlDecode (HttpContext.Текущий.Запрос.строки запроса.ToString ())