C#读取具有固定长度ANSI字符串的二进制数据,并以可读格式将其序列化为xml

时间:2018-07-24 10:31:30

标签: c# serialization xml-serialization

我正在从二进制文件读取数据,目的是将其转换为xml。 为此,我拥有定义了所有封送处理的类以读取它。

文本值是32字节固定长度的字符串-在ANSI韩文代码页中。

我使用XmlSerializer Serialize()将其另存为xml。

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
    public byte[] pName;

但是XmlSerializer仅支持带byte []的base64 / hex。

我不能使用

UnmanagedType.ByValTStr

因为它不允许指定代码页,并且我得到了不正确的,损坏的字符串,如:

  

µðÆúÆ®º§¶óÅä³²ÀÚÀå©©1

我如何才能将数据读取为EUC-KR字符串或为这些特定的32字节数组提供自定义序列化,以将其自己转换为可读格式?

我总共要处理约20个文件,每个文件具有不同的结构-但使用相同的32字节字符串作为文本。

因此,手动转换和遍历具有各种类结构的嵌套数据并不是一个可行的选择。

更新:示例结构:

   [StructLayout(LayoutKind.Sequential)]
    public struct ClientData
    {
        [MarshalAs(UnmanagedType.U4)]
        public uint index;
        [MarshalAs(UnmanagedType.U4)]
        public uint serial;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        public string pName;
        public string StrName { get { return System.Text.Encoding.GetEncoding("EUC-KR").GetString(pName, 0, 32); } }

    }

1 个答案:

答案 0 :(得分:1)

根据我写的评论,使用类似以下内容的

public class MyClass
{
    private static readonly Encoding koreanEncoding = Encoding.GetEncoding("EUC-KR");

    [XmlIgnore]
    public byte[] pName;

    public string pNameString
    {
        get => koreanEncoding.GetString(pName).TrimEnd('\0');
        set
        {
            var temp = koreanEncoding.GetBytes(value);
            Array.Resize(ref temp, 32);
            pName = temp;
        }
    }
}

因此,创建一个转换pNameString的代理pName并使用[XmlIgnore]将其从xml中删除。 XmlSerializer可能需要同时对属性中的getset进行序列化。