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

C# reading binary data with fixed length ANSI string and serializing it to xml in readable format

我正在从二进制文件中读取数据,目的是将其转换为 xml。 为此,我 class 定义了所有编组以读取它。

文本值为 32 字节固定长度字符串 - 采用 ANSI 韩语代码页。

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

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

但是 XmlSerializer 只支持 base64/hex with byte[].

我无法使用

UnmanagedType.ByValTStr

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

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

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

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

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

更新:示例结构:

   [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); } }

    }

根据我写的评论,使用如下内容:

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

    [XmlIgnore]
    public byte[] pName;

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

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