Попробовать прочитать Base64 из контента не получится - PullRequest
1 голос
/ 08 марта 2020

Я пытаюсь прочитать кодированный файл base64 из изображения. Я проанализировал документ и извлек содержимое base64, но когда я попытался декодировать информацию в байтовый массив, я получил ошибку, что отправляемая мной строка base64 повреждена. Я пытаюсь извлечь аудиофайл в кодировке Base64 из JPEG.

Я проверил строку и не могу найти проблему, может, вы, ребята, можете мне помочь?

Исключение FormatException происходит в:

Convert.FromBase64String(base64AudioString);

Прилагается, пожалуйста, найдите код:

string path = @"D:\Projects\200308 - ImageReader\ConsoleApp1\";

// --- Read JPG ---
byte[] jpegBytes = File.ReadAllBytes(path + "IMG_20190905_132110.vr.jpg");
var asString = Encoding.Unicode.GetString(jpegBytes);

// --- Check for GAUDIO-Infos ---
var start = asString.IndexOf("GAudio:Data=") + 13; // asString.IndexOf("<x:xmpmeta");
var end = asString.IndexOf("\"", start); // asString.IndexOf("</x:xmpmeta>");

if(start != -1 && end != -1)
{
    // Parse Base64 Part
    string base64AudioString = asString.Substring(start, end - start);
    //base64AudioString = base64AudioString.Replace('-', '+').Replace('_', '/').PadRight(4 * ((base64AudioString.Length + 3) / 4), '='); // Validate
    //File.WriteAllText(path + "IMG_20190905_132110.vr.jpg.base64string", base64AudioString); // Export string into file

    // Write Byte Array
    byte[] base64ByteArray = Convert.FromBase64String(base64AudioString);
    File.WriteAllBytes(path + "IMG_20190905_132110.vr.jpg.gaudio", base64ByteArray);
}

Вот также пример файла, который я пытаюсь проанализировать: https://drive.google.com/open?id=1n7dE5U0YBRKiQzH4TovT2acSubuLt_u2

РЕДАКТИРОВАТЬ: Я понял, что кодировка должна быть: Encoding.Default.GetString (jpegBytes); // не кодируем ASCII

1 Ответ

0 голосов
/ 10 марта 2020

Вы почти у цели, но вам нужны небольшие поправки.

  • вместо

    var asString = Encoding.Unicode.GetString(jpegBytes);
    

    вы должны использовать кодировку ASCII:

    var asString = Encoding.ASCII.GetString(jpegBytes);
    

    это основная причина, по которой вы получаете много нечитаемых выводов с азиатскими символами вместо кода base64.

  • тогда вы должны искать конец как:

    var end = asString.IndexOf("</rdf:RDF>", start) -4;
    
  • по крайней мере ваш пример изображения содержит такую ​​строку:

    ÿáÿÅhttp://ns.adobe.com/xmp/extension/ 2A1FDC3384D267CA2F17CF49E1B3317F h¯Ø Ì
    

    , смешанную с кодами base64 (встречается 7 раз!), Которую необходимо удалить:

            var rubbish = "http://";
            var indexRubbish = base64AudioString.IndexOf(rubbish);
            while (indexRubbish >= 0)
            {
                base64AudioString = base64AudioString.Remove(indexRubbish - 4, 79);
                indexRubbish = base64AudioString.IndexOf(rubbish);
            }
    
  • и, наконец, вам нужно заполнение (это уже было в вашем коде, но вы закомментировали)

            base64AudioString = base64AudioString.PadRight(4 * ((base64AudioString.Length + 3) / 4), '='); 
    

Полный код затем:

string path = @"D:\Projects\200308 - ImageReader\ConsoleApp1\";

// --- Read JPG ---
byte[] jpegBytes = File.ReadAllBytes(path + "IMG_20190905_132110.vr.jpg");
var asString = Encoding.ASCII.GetString(jpegBytes);

// --- Check for GAUDIO-Infos ---
var start = asString.IndexOf("GAudio:Data=") + 13;
var end = asString.IndexOf("</rdf:RDF>", start) -4;

if (start != -1 && end != -1)
{
    // Parse Base64 Part
    string base64AudioString = asString.Substring(start, end - start);
    var rubbish = "http://";
    var indexRubbish = base64AudioString.IndexOf(rubbish);
    while (indexRubbish >= 0)
    {
        base64AudioString = base64AudioString.Remove(indexRubbish - 4, 79);
        indexRubbish = base64AudioString.IndexOf(rubbish);
    }

    base64AudioString = base64AudioString.PadRight(4 * ((base64AudioString.Length + 3) / 4), '='); // Validate

    byte[] base64ByteArray = Convert.FromBase64String(base64AudioString);
    File.WriteAllBytes(path + "IMG_20190905_132110.vr.mp3", base64ByteArray);
}

В результате воспроизводится mp3-файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...