C#如何利用结构体对固定格式数据进行解析

2019-12-30 19:10:09王旭

好了现在结构体有了,转换方法也有了那么就来使用一下吧!先将结构体转为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字符串,方便显示和调试可以不用管。

然后调试运行得到结果:

C#,结构体,解析,固定格式数据

我擦,这是什么情况?什么叫“未能封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配?????”

调试一下就可以发现实际结构体标记的SizeConst和ToCharArray()函数得到的长度并不一样,字符串通过ToCharArray()得到的长度不足导致出现这个异常。

既然是长度不足,那么就想办法补足吧。

写个静态扩展方法,包含上面的GetString扩展方法:


public static char[] GetFixLengthChar(this string s,int length)
    {
      char[] chaVal = new char[length];
      Array.Copy(s.PadRight(length, '').ToCharArray(), chaVal, length);
      return chaVal;
    }
    public static string GetString(this char[] cc)
    {
      return GetString(cc,true);
    }
    public static string GetString(this char[] cc,bool isTrimEnd)
    {
      if (isTrimEnd)
      {
        return new string(cc).TrimEnd('');
      }
      else
      {
        return new string(cc);
      }
    }

GetFixLengthChar是将字符串转为固定长度char数组,GetString是从char数组转为字符串,因为有''可以用TrimEnd函数去掉,这样字符串后面就不会有一排空的了。

我们再试试结果:

C#,结构体,解析,固定格式数据