好了现在结构体有了,转换方法也有了那么就来使用一下吧!先将结构体转为byte数组,然后再还原结构体试试:
static void Main(string[] args)
{
try
{
InfoStruct Info;
Info.HardwareNum = "1.0.0".ToCharArray();
Info.HardwareVersion = "ABC1234567".ToCharArray();
Info.DeviceName = "Device Name1".ToCharArray();
Info.ModuleID = 0x10000001;
Info.SlotNum = 1;
Info.SoftwareDate = "2018/1/22".ToCharArray();
Info.SoftwareVersion = "V1.0.0".ToCharArray();
var b = StructHelper.StuctToByte(Info);
Console.WriteLine("Struct length:"+b.Length);
Console.WriteLine("Hex:"+ByteToolsHelper.ByteArrayToHexString(b," "));
var s = StructHelper.ByteToStuct<InfoStruct>(b);
Console.WriteLine("Name:"+s.DeviceName.GetString());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
其中ByteToolsHelper.ByteArrayToHexString是我封装的一个函数,将byte数组转为Hex字符串,方便显示和调试可以不用管。
然后调试运行得到结果:

我擦,这是什么情况?什么叫“未能封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配?????”
调试一下就可以发现实际结构体标记的SizeConst和ToCharArray()函数得到的长度并不一样,字符串通过ToCharArray()得到的长度不足导致出现这个异常。
既然是长度不足,那么就想办法补足吧。
写个静态扩展方法,包含上面的GetString扩展方法:
public static char[] GetFixLengthChar(this string s,int length)
{
char[] chaVal = new char[length];
Array.Copy(s.PadRight(length, '