亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#如何利用結構體對固定格式數據進行解析

2019-10-29 21:06:37
字體:
來源:轉載
供稿:網友

本文為大家分享了C#利用結構體解析固定格式數據的具體代碼,供大家參考,具體內容如下

制定了一個通訊協議,然后其數據部分有如下格式。

C#,結構體,解析,固定格式數據

第三列代表的是字節數,第4列是數據類型。

當傳輸或者收到一個byte數組的時候(下面Hex數據),按照對應格式進行解析,解析方法有很多種,網上看到了一種方式是以結構體的方式來解析的,類似C/C++方式。

Hex數據:01 01 00 00 10 44 65 76 69 63 65 20 4E 61 6D 65 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 31 2E 30 2E 30 00 00 00 00 00 00 00 00 00 00 00 41 42 43 31 32 33 34 35 36 37 00 00 00 00 00 00 56 31 2E 30 2E 30 00 00 00 00 00 00 00 00 00 00 32 30 31 38 2F 31 2F 32 32 00 00 00 00 00 00 00

定義一個結構體:

using System.Runtime.InteropServices;[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]  public struct InfoStruct  {    [MarshalAs(UnmanagedType.U1, SizeConst = 1)]    public byte SlotNum;    [MarshalAs(UnmanagedType.U4,SizeConst =4)]    public UInt32 ModuleID;    [MarshalAs(UnmanagedType.ByValArray,SizeConst =32)]    public char[] DeviceName;    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]    public char[] HardwareNum;    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]    public char[] HardwareVersion;    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]    public char[] SoftwareVersion;    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]    public char[] SoftwareDate;  }

再寫一個輔助解析的靜態幫助類,該類提供將結構體轉成byte數組和byte數組轉成結構體功能,我在原來的方法上面添加了泛型,功能不變:

public static class StructHelper  {    /// <summary>    /// byte數組轉目標結構體    /// </summary>    /// <param name="bytes">byte數組</param>    /// <param name="type">目標結構體類型</param>    /// <returns>目標結構體</returns>    public static T ByteToStuct<T>(byte[] DataBuff_) where T:struct    {      Type t = typeof(T);      //得到結構體大小      int size = Marshal.SizeOf(t);      //數組長度小于結構體大小      if (size > DataBuff_.Length)      {        return default(T);      }      //分配結構體大小的內存空間      IntPtr structPtr = Marshal.AllocHGlobal(size);      //將byte數組cpoy到分配好的內存空間內      Marshal.Copy(DataBuff_, 0, structPtr, size);      //將內存空間轉換為目標結構體      T obj = (T)Marshal.PtrToStructure(structPtr, t);      //釋放內存空間      Marshal.FreeHGlobal(structPtr);      return obj;    }    /// <summary>    /// 結構體轉byte數組    /// </summary>    /// <param name="objstuct">結構體</param>    /// <returns>byte數組</returns>    public static byte[] StuctToByte(object objstuct)    {      //得到結構體大小      int size = Marshal.SizeOf(objstuct);      //創建byte數組      byte[] bytes = new byte[size];      //分配結構體大小的空間      IntPtr structPtr = Marshal.AllocHGlobal(size);      //將結構體copy到分配好的內存空間內      Marshal.StructureToPtr(objstuct, structPtr, false);      //從內存空間copy到byte數組      Marshal.Copy(structPtr, bytes, 0, size);      //釋放內存空間      Marshal.FreeHGlobal(structPtr);      return bytes;    }  }

好了現在結構體有了,轉換方法也有了那么就來使用一下吧!先將結構體轉為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, '/0').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('/0');      }      else      {        return new string(cc);      }    }

GetFixLengthChar是將字符串轉為固定長度char數組,GetString是從char數組轉為字符串,因為有'/0'可以用TrimEnd函數去掉,這樣字符串后面就不會有一排空的了。

我們再試試結果:

C#,結構體,解析,固定格式數據

沒問題!成功的轉換和還原了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久久久久尿| 51视频国产精品一区二区| 亚洲人成电影网站| 欧美综合国产精品久久丁香| 亚洲美女动态图120秒| 亚洲女人天堂视频| 中文字幕日韩电影| 在线免费观看羞羞视频一区二区| 亚洲大胆人体在线| 在线观看免费高清视频97| 欧美视频裸体精品| 亚洲自拍高清视频网站| 国产日韩欧美影视| 久久精品国产一区二区三区| 色综合伊人色综合网站| 欧美性高潮床叫视频| 91av视频在线免费观看| 国产97色在线| 欧美日韩国产精品一区二区三区四区| 欧美巨乳美女视频| 欧美大片va欧美在线播放| 一夜七次郎国产精品亚洲| 亚洲人成在线观| 国产91在线播放精品91| 亚洲国产第一页| 欧美日韩国产一区在线| 国产综合香蕉五月婷在线| 欧美性极品xxxx娇小| 精品国产视频在线| 亚洲精品国精品久久99热| 国产精品成人一区| 欧美精品久久一区二区| 国产成人综合一区二区三区| 日韩视频永久免费观看| 91av视频在线| 欧美成人第一页| 成人综合网网址| 91久久久亚洲精品| 国产极品jizzhd欧美| 国产精品久久久久久av下载红粉| 精品magnet| 欧美乱人伦中文字幕在线| 成人精品福利视频| 日韩av在线影院| 欧美俄罗斯性视频| 国产精品国产自产拍高清av水多| 亚洲少妇激情视频| 亚洲网站在线观看| 久久影视免费观看| 自拍视频国产精品| 中文字幕不卡av| 欧美午夜视频一区二区| 国产精品露脸av在线| 精品视频一区在线视频| 欧美伦理91i| 久久综合色影院| 国产成人亚洲综合91精品| 亚洲精品福利免费在线观看| 久久福利视频导航| 中文字幕亚洲欧美日韩在线不卡| 国内精品一区二区三区四区| 欧美日韩国产一区二区| 欧美精品在线免费观看| 国内精品中文字幕| 亚洲激情中文字幕| 亚洲欧美在线第一页| 成人免费在线视频网址| 欧美性猛交xxxx乱大交3| 久久精品国产一区二区电影| 上原亚衣av一区二区三区| 久久久久99精品久久久久| 不卡av在线网站| 一区二区三区在线播放欧美| 91精品久久久久久久久中文字幕| 日韩欧美在线观看视频| 欧美在线一区二区三区四| 欧美激情精品久久久久久蜜臀| 欧美精品在线免费播放| 国产91在线播放精品91| 国产精品免费久久久久久| 欧美午夜美女看片| 国产午夜精品视频免费不卡69堂| 97超碰国产精品女人人人爽| 国产在线不卡精品| 2019亚洲日韩新视频| 国产亚洲日本欧美韩国| 欧美激情国产日韩精品一区18| 欧美日韩精品在线播放| 久久视频在线播放| 色综合91久久精品中文字幕| 97婷婷大伊香蕉精品视频| 影音先锋欧美在线资源| 亚洲第一av网| 中文字幕视频在线免费欧美日韩综合在线看| 成人有码视频在线播放| 日本精品性网站在线观看| 狠狠做深爱婷婷久久综合一区| 久久999免费视频| 精品偷拍各种wc美女嘘嘘| 亚洲小视频在线| 欧美一区二区三区免费观看| 国产mv免费观看入口亚洲| 91久久中文字幕| 91免费电影网站| 国产精品成人播放| 久久久久久久一| 亚洲第一精品久久忘忧草社区| 欧美性猛交xxxxx水多| 国产69久久精品成人| 亚洲aaaaaa| 91精品视频在线播放| 欧美午夜久久久| 国产这里只有精品| 国产一区二区免费| 最新国产成人av网站网址麻豆| 精品久久久久久久久久久久| 国产精品亚洲视频在线观看| 欧美激情视频给我| 日韩成人激情在线| 国产成人精品网站| 国产精品高潮呻吟久久av黑人| 91av免费观看91av精品在线| 成人xxxx视频| 97精品国产97久久久久久| 一本色道久久88亚洲综合88| 亚洲人成77777在线观看网| 91在线无精精品一区二区| 亚洲精品网址在线观看| 国产精品wwwwww| 26uuu日韩精品一区二区| 韩国v欧美v日本v亚洲| 国产精品日韩欧美大师| 欧美激情亚洲综合一区| 日韩福利伦理影院免费| 国产精品扒开腿做爽爽爽的视频| 欧美成在线观看| 成人乱人伦精品视频在线观看| www.亚洲一二| 国产在线久久久| 亚洲色图第三页| 欧美精品一区二区三区国产精品| 91精品视频观看| 日韩电影免费观看在线| 欧美wwwxxxx| 中文字幕av一区| 成人国产精品日本在线| 欧美日韩裸体免费视频| 日韩女优人人人人射在线视频| 国外成人性视频| 日韩中文理论片| 日韩网站在线观看| 国产精品极品在线| 成人av在线亚洲| 欧美裸体视频网站| 揄拍成人国产精品视频| 一区二区三区美女xx视频| 国产成一区二区| 亚洲一区二区久久久久久| 国产精品久久久久久久久久东京| 欧美丰满少妇xxxxx做受| 亚洲风情亚aⅴ在线发布| 国产成人精品综合| 日本中文字幕成人| 在线观看国产精品日韩av|