Ошибка при преобразовании base64 в массив байтов [дубликат]

Используйте moment.js для синтаксического анализа дат:

var caseOne = moment("Jul 8, 2005", "MMM D, YYYY", true).toDate();
var caseTwo = moment("2005-07-08", "YYYY-MM-DD", true).toDate();

Третий аргумент определяет строгий разбор (доступно с 2.3.0). Без него moment.js также может давать неверные результаты.

51
задан Rohit Verma 27 February 2013 в 16:16
поделиться

7 ответов

Я устроил аналогичный контекст, как вы описали, и я столкнулся с той же ошибкой. Мне удалось заставить его работать, удалив " с начала и конца содержимого и заменив \/ на /.

Вот фрагмент кода:

var result = client.Execute(request);
var response = result.Content
    .Substring(1, result.Content.Length - 2)
    .Replace(@"\/","/");
byte[] d = Convert.FromBase64String(response);

В качестве альтернативы вы можете использовать XML для формата ответа:

[WebGet(UriTemplate = "ReadFile/Convert", ResponseFormat = WebMessageFormat.Xml)]  
public string ExportToExcel() { //... }

На стороне клиента:

request.AddHeader("Accept", "application/xml");
request.AddHeader("Content-Type", "application/xml");
request.OnBeforeDeserialization = resp => { resp.ContentType = "application/xml"; };

var result = client.Execute(request);
var doc = new System.Xml.XmlDocument();
doc.LoadXml(result.Content);
var xml = doc.InnerText;
byte[] d = Convert.FromBase64String(xml);
3
ответ дан Alex Filipovici 17 August 2018 в 15:17
поделиться

Убедитесь, что ваши данные изображения содержат некоторую информацию заголовка в начале:

imageCode = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...

Это приведет к вышеуказанной ошибке.

Просто удалите все перед первым включением и включите запятая, и вам хорошо идти.

imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
41
ответ дан bendecko 17 August 2018 в 15:17
поделиться
  • 1
    Если бы эта точная проблема каким-то образом. Логика - удалить все после ,, если присутствует data:. Bam. Работаю сейчас. – Maxime Rouiller 14 June 2016 в 13:14

Мы можем удалить ненужный ввод строки перед значением.

string convert = hdnImage.Replace("data:image/png;base64,", String.Empty);

byte[] image64 = Convert.FromBase64String(convert);
15
ответ дан Hasan Tuna Oruç 17 August 2018 в 15:17
поделиться
  • 1
    Это решение сработало для меня. Но это специально для png-изображений. Есть ли обобщенный синтаксис, который заменяет все виды расширений изображений? – Karan Desai 1 September 2016 в 07:25
  • 2
    Теперь я прочитал ваш комментарий. Я не пытаюсь это сделать, но вы можете использовать это: hdnImage.Replace (& quot; данные: image / png; base64, & quot ;, String.Empty) .Replace (& quot; data: image / jpg; base64, & quot ;, String.Empty ) .Replace ("data: image / bmp; base64,", String.Empty); снова, я не пытаюсь это сделать. попробуйте написать и написать мне. я изменю. – Hasan Tuna Oruç 5 September 2016 в 11:32

Возможно, он преобразуется в модифицированный Base64, где символы + и / изменены на - и _. См. http://en.wikipedia.org/wiki/Base64#Implementations_and_history

. Если это так, вам нужно изменить его:

string converted = base64String.Replace('-', '+');
converted = converted.Replace('_', '/');
47
ответ дан Jim Mischel 17 August 2018 в 15:17
поделиться
  • 1
    Я сделал это ... Спасибо вам! Замена символов соответствующими. Но это конкретное решение? я имею в виду, как я могу гарантировать, что для всех файлов это будет символ, который нужно заменить? – Rohit Verma 27 February 2013 в 16:52
  • 2
    @RohitVerma: Не знаю. Вам нужно выяснить, где эти символы меняются, и определить, может ли он изменить любые другие символы. Я не знаком с RestSharp, поэтому я не могу советовать там. Если мой ответ ответил на ваш вопрос, принято считать его принятым ответом. (Нажмите галочку рядом с ответом слева). – Jim Mischel 27 February 2013 в 17:14

Поскольку вы возвращаете строку как JSON, эта строка будет включать кавычки открытия и закрытия в исходном ответе. Поэтому ваш ответ должен выглядеть следующим образом:

"abc123XYZ=="

или что-то еще ... Вы можете попробовать подтвердить это с помощью Fiddler.

Мое предположение заключается в том, что result.Content является исходной строкой , включая кавычки. Если это так, то result.Content нужно будет десериализовать, прежде чем вы сможете его использовать.

1
ответ дан Joe Enos 17 August 2018 в 15:17
поделиться
  • 1
    вы правы, это включает в себя & quot; & Quot; но здесь дело в том, что помимо добавления этих кавычек другие символы также заменяются. – Rohit Verma 27 February 2013 в 16:57
  • 2
    Дессериализация этой строки с использованием сериализатора JSON будет обеспечивать как котировки, так и спрятанную косую черту. Выключение косой черты с обратной косой чертой - это то, что делают некоторые сериализаторы JSON - использование десериализатора превратит \ / обратно в простое /, так что вы получите действительную базу-64. Поскольку вы получаете JSON, всегда хорошо разбираться в JSON, даже если это простая строка. – Joe Enos 27 February 2013 в 18:32

На всякий случай, если вы не знаете тип загруженного изображения, и вам просто нужно удалить его заголовок base64:

 var imageParts = model.ImageAsString.Split(',').ToList<string>();
 //Exclude the header from base64 by taking second element in List.
 byte[] Image = Convert.FromBase64String(imageParts[1]);
1
ответ дан Mahdi Alkhatib 17 August 2018 в 15:17
поделиться

Как сказал Алекс Филипович , проблема была неправильной кодировкой. Файл, который я прочитал, был UTF-8-BOM и сбросил указанную выше ошибку на Convert.FromBase64String(). Переход на UTF-8 работал без проблем.

0
ответ дан testing 17 August 2018 в 15:17
поделиться
Другие вопросы по тегам:

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