尝试从内容中读取 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 文件。
我尝试从图像中读取 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 文件。