【问题标题】:.Net Parse blob data from MySQL dump file.Net 从 MySQL 转储文件中解析 blob 数据
【发布时间】:2021-05-03 03:47:21
【问题描述】:

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

我将其粘贴为屏幕截图,因为如果您在此处复制并粘贴,图像中的字节 (0xFF,0xD8,0xFF,0xE0) 会变为奇怪的字符 (ÿؿ FrameJFIF\0\0)。 这是我试图处理图像的代码 sn-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]);
        }
    }

我知道问题在于我正在以 UTF8 格式读取文件,并且这些字节被转换为字符,但我不知道如何以不同的方式进行操作。我也尝试了这个选项:获取图像开始的文档中的位置,以字节表示返回文件并获取字节,但这不起作用,因为位置不同并且生成的文件不从 0xFF、0xD8、0xFF、0xE0 开始。但稍早(在表格描述的中间)并且文件长度与我需要的不匹配。事实证明,如果我用 UTF8 读取它,我只能浏览这个文件,但我需要按原样获取文档片段。 在此示例中,图像为 *.jpg 格式,但也可以是任何其他格式。

【问题讨论】:

    标签: c# mysql .net .net-core


    【解决方案1】:

    这些不是 UTF-8 字节,所以 Encoding.UTF8.GetString(sqlFile) 不起作用;它会破坏数据。

    您需要直接处理原始的byte[]。格式相当简单:'\\ 转义;每隔一个字节就代表它自己。 (而且整个 BLOB 都被' 字节包围。)

    一旦您在图像数据之前读取文件直到打开',处理循环将如下所示(伪代码):

    List<byte> output = new();
    int pos = currentPos + 1; // first byte after the opening '
    
    // read until the terminating '
    while (bytes[pos] != (byte) '\'')
    {
        // if it's a backslash, skip it and read the next byte instead
        if (bytes[pos] == (byte) '\\')
            pos++;
    
        // copy this byte to the output
        output.Add(bytes[pos]);
        pos++;
    }
    var imageData = output.ToArray();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-03
      • 2010-11-06
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      相关资源
      最近更新 更多