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. Строка - это именно то, что было записано в файл (с добавлением "\ 0" в конце, но я не думаю, что даже что-то делает, даже урезал все еще бросает). Я даже копировал и вставлял всю строку в тестовый метод и сжимал/декомпрессировал это. Прекрасно работает.

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

Любые идеи о том, что я делаю неправильно?

Ответ 1

Вы говорите

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

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

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

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

Примечания

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

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

-or-

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

и что

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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