用自定义代码页读取字节到XML

本文关键字:字节 XML 读取 自定义 代码 | 更新日期: 2023-09-27 18:17:55

我有一个由字节组成的大文件,编码在代码页852中。我需要读取字节并将其导出为字符串以放入Objects中,然后将这些对象序列化为XML。

读取字节的映射函数为:

private string Mapper(int start, int length)
{
   byte[] result = new byte[length];
   Array.Copy(baseFile, localOffset + start, result, 0, length);
   return Encoding.ASCII.GetString(result, 0, length); 
}

本地偏移量就是数据库中的位置。之后,我使用Mapper函数填充对象实例的字符串字段,然后对其进行序列化。下面是它的方法:

 private string XMLify(Object node)
    {
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("", "");
        var stringWriter = new StringWriter();
        var serializer = new XmlSerializer(node.GetType());
        serializer.Serialize(stringWriter, node, ns);
        String s = stringWriter.ToString();
        return s.Substring(s.IndexOf(Environment.NewLine) + 1);
    }

但是,当我序列化对象实例时。XML包含诸如"&# x 0;"(添加空格只是为了正确显示)等等。当在十六进制编辑器中查看数据库时,该特定的一个是空白的,并且在有空格的情况下被映射多少次。
我知道源文件是在代码页852,我如何将其转换为1250导出为XML?

用自定义代码页读取字节到XML

不要使用ASCII编码来解析数据,使用实际代码页的编码:

Encoding encoding = Encoding.GetEncoding(852);
return encoding.GetString(result, 0, length); 

更新:

对于这个问题,理解编码实际上是做什么的很重要:通过编码,您可以控制字符串和二进制数据之间的转换。字节数组和字符串位于转换的两端。因此,一旦你有了字节数组或字符串,就不需要编码了。二进制数据已经编码,字符串总是Unicode。

您的XMLify方法返回一个字符串(使用字符串写入器),因此编码在这里不是问题。除非在下游的某个地方有另一个转换到字节数组,否则您的问题不是Encoding。

你真的确认XML是不正确的吗?虽然XML需要的转义比HTML少得多,但有些字符需要转义。所以你的�可以是输入数据的有效表示形式。除非您实际提供序列化的对象(包括其字段中的数据)和生成的XML,否则无法判断是否存在错误。我假设您在其他地方de序列化了XML。如果反序列化是正确的,那么您可能没有问题。

&#x0是null字符的实体。之所以会发生这种情况,是因为这个字符出现在序列化器被要求序列化的字符串中。