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

我正在从二进制文件中读取数据,目的是将其转换为 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); } }


    }


繁星点点滴滴
浏览 265回答 1
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 可能需要将属性中的aget和 aset序列化。
打开App,查看更多内容
随时随地看视频慕课网APP