Декодирование base64-закодированных данных из xml документа

Значение JSON является строкой, числом, объектом, массивом, верным, ложным или пустым. Таким образом, это - просто строка. Нет никакого официального способа представить даты в JSON. Этот синтаксис является с asp.net ajax реализацией. Другие используют формат ISO 8601.

можно проанализировать его как это:

var s = "\/Date(1221644506800-0700)\/";
var m = s.match(/^\/Date\((\d+)([-+]\d\d)(\d\d)\)\/$/);
var date = null;
if (m)
  date = new Date(1*m[1] + 3600000*m[2] + 60000*m[3]);
5
задан Kjensen 23 November 2009 в 12:22
поделиться

5 ответов

Для первого кадра я не использовал какой-либо язык программирования, только Notepad ++

Я открыл внутри xml-файл, скопировал и вставил необработанное содержимое base64 в новый файл (без квадратных скобок ).

После этого я выбрал все (Strg-A) и использовал опцию Extensions - Mime Tools - Base64 decode. Это вызвало ошибку о неправильной длине текста (должно быть мод 4). Поэтому я просто добавил два знака равенства ('=') в качестве заполнителя в конце, чтобы получить правильную длину.

Еще одна попытка, и она успешно декодируется в 'что-то'. Просто сохраните файл как .jpg, и он откроется в любой программе просмотра изображений.

Я бы сказал, что что-то не так с данными, которые вы получите. У них просто нет нужного количества знаков равенства в конце, чтобы заполнить количество знаков, которые можно разбить на пакеты по 4.

"Легким" способом было бы добавить знак равенства до тех пор, пока декодирование не выдаст ошибку. Лучшим способом было бы подсчитать количество символов (минус CR / LF!) И добавить необходимые за один шаг.

Дальнейшие исследования

После некоторого кодирования и чтения функция преобразования , проблема в неправильной установке знака равенства от производителя. В Notepad ++ нет проблем с множеством знаков равенства, но функция Convert из MS работает только с нулем, одним или двумя знаками. Так что, если вы заполните уже существующий дополнительными знаками равенства, вы тоже получите ошибку! Чтобы эта чертова штука заработала, вам нужно отрезать все существующие знаки, подсчитать, сколько нужно, и добавить их снова.

Вот мой код (не совсем идеальный, но достаточно для хорошего старта). точка):; -)

    static void Main(string[] args)
    {
        var elements = XElement
            .Load("test.xml")
            .XPathSelectElements("//media/media-object[@encoding='base64']");
        foreach (XElement element in elements)
        {
            var image = AnotherDecode64(element.Value);
        }
    }

    static byte[] AnotherDecode64(string base64Decoded)
    {
        string temp = base64Decoded.TrimEnd('=');
        int asciiChars = temp.Length - temp.Count(c => Char.IsWhiteSpace(c));
        switch (asciiChars % 4)
        {
            case 1:
                //This would always produce an exception!!
                //Regardless what (or what not) you attach to your string!
                //Better would be some kind of throw new Exception()
                return new byte[0];
            case 0:
                asciiChars = 0;
                break;
            case 2:
                asciiChars = 2;
                break;
            case 3:
                asciiChars = 1;
                break;
        }
        temp += new String('=', asciiChars);

        return Convert.FromBase64String(temp);
    }
9
ответ дан 14 December 2019 в 04:40
поделиться

Try using Linq to XML:

using System.Xml.XPath;

class Program
{
    static void Main(string[] args)
    {
        var elements = XElement
            .Load("test.xml")
            .XPathSelectElements("//media/media-object[@encoding='base64']");
        foreach (var element in elements)
        {
            byte[] image = Convert.FromBase64String(element.Value);
        }
    }
}

UPDATE:

After downloading the XML file and analyzing the value of the media-object node it is clear that it is not a valid base64 string:

string value = "PUT HERE THE BASE64 STRING FROM THE XML WITHOUT THE NEW LINES";
byte[] image = Convert.FromBase64String(value);

throws a System.FormatException saying that the length is not a valid base 64 string. Event when I remove the \n from the string it doesn't work:

var elements = XElement
    .Load("20091123-125320.xml")
    .XPathSelectElements("//media/media-object[@encoding='base64']");
foreach (var element in elements)
{
    string value = element.Value.Replace("\n", "");
    byte[] image = Convert.FromBase64String(value);
}

also throws System.FormatException.

0
ответ дан 14 December 2019 в 04:40
поделиться

Строка base64 недействительна, как уже сказал Оливер, длина строки должна быть кратной 4 после удаления символов пробела. Если вы посмотрите на конец строки base64 (см. Ниже), вы увидите, что строка короче остальных.

RRRRRRRRRRRRRRRRRRRRRRRRRRRRX//Z=

Если вы удалите эту строку, ваша программа будет работать, но в результирующем изображении будет отсутствовать раздел в правом нижнем углу. Вам нужно заполнить эту строку, чтобы общая длина строки была правильной. По моим расчетам, если у вас было 3 символа, он должен работать.

RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRX//Z=
1
ответ дан 14 December 2019 в 04:40
поделиться

Well, it's all very simple. CDATA is a node itself, so mediaObjectNode.InnerText actually produces , which is obviously not valid Base64-encoded data.

To make things work, use mediaObjectNode.ChildNodes[0].Value and pass that value to Convert.FromBase64String'.

-1
ответ дан 14 December 2019 в 04:40
поделиться

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

(Для записи, windows-1252 не совсем то же самое, что iso-8859-1, так что это может быть причиной проблемы, исключая другие источники коррупции.)

-2
ответ дан 14 December 2019 в 04:40
поделиться
Другие вопросы по тегам:

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