C# .Net解析MySQL转储文件中的blob数据
有一个MySQL转储,我需要从中获取一个图像。我已经编写了一个小的文本解析器来解析这个文件,但我有一个编码问题,我无法以任何方式解决。以下是MySQL转储的一个片段: 我将其粘贴为屏幕截图,因为如果复制并粘贴到此处,图像中的字节(0xFF,0xD8,0xFF,0xE0)将变为奇怪的字符(JFIF\0\0)。 下面是我试图处理图像的代码片段:C# .Net解析MySQL转储文件中的blob数据,c#,mysql,.net,.net-core,C#,Mysql,.net,.net Core,有一个MySQL转储,我需要从中获取一个图像。我已经编写了一个小的文本解析器来解析这个文件,但我有一个编码问题,我无法以任何方式解决。以下是MySQL转储的一个片段: 我将其粘贴为屏幕截图,因为如果复制并粘贴到此处,图像中的字节(0xFF,0xD8,0xFF,0xE0)将变为奇怪的字符(JFIF\0\0)。 下面是我试图处理图像的代码片段: List<ImageRecord> ImagesList = new List<ImageRecord>(); p
List<ImageRecord> ImagesList = new List<ImageRecord>();
private void Parse(byte[] sqlFile)
{
var sql = Encoding.UTF8.GetString(sqlFile);
string strStart = @"INSERT INTO `images` VALUES (";
string strEnd = @"');";
int Start = sql.IndexOf(strStart, 0) + strStart.Length;
int End = sql.IndexOf(strEnd, Start);
var value = sql.Substring(Start, End - Start);
var valueslist = value.Split("'),('");
foreach (var imagedata in valueslist)
{
ImageRecord cfg = new ImageRecord(imagedata);
this.ImagesList.Add(cfg);
}
}
public class ImageRecord
{
public int id { get; set; }
public DateTime timestamp { get; set; }
public string user { get; set; } = String.Empty;
public byte[] imagedata { get; set; }
public ImageRecord() { }
public ImageRecord(string sqlpart)
{
string value = sqlpart;
if (sqlpart[0] == '\'')
value = value.Substring(1, value.Length - 1);
var valueslist = value.Split("', '");
this.id = Convert.ToInt32(valueslist[0]);
this.timestamp = Convert.ToDateTime(valueslist[1]);
this.user = valueslist[2];
this.imagedata = Encoding.UTF8.GetBytes(valueslist[3]);
}
}
List ImagesList=new List();
私有void解析(字节[]sqlFile)
{
var sql=Encoding.UTF8.GetString(sqlFile);
字符串strStart=@“插入到`images`值(”;
字符串强度=@“');
int Start=sql.IndexOf(strStart,0)+strStart.Length;
int End=sql.IndexOf(strengd,Start);
var value=sql.Substring(Start,End-Start);
var valueslist=value.Split(“'),(“”);
foreach(valueslist中的var imagedata)
{
ImageRecord cfg=新的ImageRecord(imagedata);
this.ImagesList.Add(cfg);
}
}
公共类图像记录
{
公共int id{get;set;}
公共日期时间时间戳{get;set;}
公共字符串用户{get;set;}=string.Empty;
公共字节[]图像数据{get;set;}
公共ImageRecord(){}
公共ImageRecord(字符串sqlpart)
{
字符串值=sqlpart;
如果(sqlpart[0]='\'')
value=value.Substring(1,value.Length-1);
var valueslist=value.Split(“,”);
this.id=Convert.ToInt32(值列表[0]);
this.timestamp=Convert.ToDateTime(valueslist[1]);
this.user=valueslist[2];
this.imagedata=Encoding.UTF8.GetBytes(valueslist[3]);
}
}
我知道问题是我以UTF8格式读取文件,这些字节被转换为字符,但我不知道如何做得不同。我还尝试了这个选项:获取文档中图像开始的位置,返回到以字节表示的文件并获取字节,但这不起作用,因为位置不同,并且生成的文件不以0xFF、0xD8、0xFF、0xE0开头。但是稍早一点(在表描述的中间),文件长度与我需要的不匹配。事实证明,只有在UTF8中读取该文件时,我才能浏览该文件,但我需要按原样获取文档片段。
在本例中,图像是*.jpg格式,但可以是任何其他格式。这些不是UTF-8字节,因此
编码.UTF8.GetString(sqlFile)
不起作用;它会破坏数据
您需要直接处理原始的字节[]
。格式相当简单:'
或\
用\
转义;每隔一个字节代表它自己。(整个BLOB被“
字节包围。)
一旦您在图像数据之前读取了文件直到开头的”
,处理循环将如下所示(伪代码):
List output=new();
int pos=当前pos+1;//打开后的第一个字节'
//一直读到最后一刻
while(字节[pos]!=(字节)\'')
{
//如果是反斜杠,请跳过它并读取下一个字节
如果(字节[pos]==(字节)\\\)
pos++;
//将此字节复制到输出
添加(字节[pos]);
pos++;
}
var imageData=output.ToArray();