为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
繁星点点滴滴 2021-10-24 19:20:00
我正在从二进制文件中读取数据,目的是将其转换为 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 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

根据我写的评论,使用类似的东西:


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序列化。


查看完整回答
反对 回复 2021-10-24
  • 1 回答
  • 0 关注
  • 264 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信