【发布时间】: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 格式,但也可以是任何其他格式。
【问题讨论】: