尝试从内容中读取 Base64 失败

Try to Read Base64 from Content fails

我尝试从图像中读取 base64 编码的文件。 我解析了文档并提取了 base64 内容,但是当我尝试将信息解码为字节数组时出现错误,我提供的 base64 字符串已损坏。 我尝试从 JPEG 中提取 base64 编码的音频文件。

我检查了字符串,找不到问题,也许你们可以帮助我?

FormatException 发生在:

Convert.FromBase64String(base64AudioString);

附上请找代码:

string path = @"D:\Projects0308 - 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

您快完成了,但您需要进行一些较小的更正。

  • 而不是

    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:\Projects0308 - 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 文件。