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