Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .Net解析MySQL转储文件中的blob数据_C#_Mysql_.net_.net Core - Fatal编程技术网

C# .Net解析MySQL转储文件中的blob数据

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

有一个MySQL转储,我需要从中获取一个图像。我已经编写了一个小的文本解析器来解析这个文件,但我有一个编码问题,我无法以任何方式解决。以下是MySQL转储的一个片段:

我将其粘贴为屏幕截图,因为如果复制并粘贴到此处,图像中的字节(0xFF,0xD8,0xFF,0xE0)将变为奇怪的字符(JFIF\0\0)。 下面是我试图处理图像的代码片段:

    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();