【发布时间】:2020-03-15 22:27:11
【问题描述】:
我尝试从图像中读取 base64 编码文件。 我解析了文档并提取了 base64 内容,但是当我尝试将信息解码为字节数组时出现错误,我提供的 base64 字符串已损坏。 我尝试从 JPEG 中提取 base64 编码的音频文件。
我检查了字符串,没有找到问题,也许你们可以帮助我?
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
【问题讨论】:
-
你看过失败的字符串的内容了吗?它实际上可能不是 Base64,例如长度不正确(4 的倍数)或包含无效字符。
-
首先我必须承认我对这种音频格式一无所知。来自您这边的更多信息会有所帮助,我没有找到任何东西。但是我查看了该文件:当您在记事本++ 中打开该 jpeg 并搜索
GAudio:Data=时,您会注意到首先有一些base64 数据,然后是ÿáÿÅhttp://ns.adobe.com/xmp/extension/ 2A1FDC3384D267CA2F17CF49E1B3317F h¯ØÌ`,然后是更多base64 数据。这就是为什么你不能只解码开始和结束之间的整个部分。但是由于我不知道那种格式,所以我不知道要采取什么并将其放入文件中以获得可播放的音频文件。 -
大家好,感谢您的回复。该 URL 可能是您正确的损坏。我从谷歌文档中获取我的信息,因为这个文件是由谷歌纸板相机应用程序创建的,它在文件中放入了一些更多信息,包括音频。这是文档的链接。在页面末尾,您将找到我喜欢解析的信息示例:developers.google.com/vr/reference/…
-
音频一般保存为M4A,图像中定义了Mime类型,稍后我会在提取数据时考虑到设置正确的文件扩展名。我有一个可用的 base64 提取作为我用不同工具提取的比较。当我在家时,我会将其上传到帖子中。到目前为止谢谢!
-
@Zero:我找到了一种验证方法,可以使用:base64AudioString = base64AudioString.Replace('-', '+').Replace('_', '/' ).PadRight(4 * ((base64AudioString.Length + 3) / 4), '=');