Строка 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 ())