我正在从二进制文件读取数据,目的是将其转换为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); } }
}
答案 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可能需要同时对属性中的get
和set
进行序列化。