C# 將結構體轉為位元組流的方式

来源:http://www.cnblogs.com/HouseNumber1703/archive/2016/09/05/5841886.html
-Advertisement-
Play Games

1、 將基礎類型轉為byte數組存儲 2.C#中結構體 與 位元組流 相互轉化 3. C# 結構體位元組對齊 在上述結構體與位元組流轉換第二種方法中,獲取結構體長度int size = Marshal.SizeOf(Mystruct);,並不是13,而是16。在記憶體特定類型數據結構起始地址通常有一定的對齊 ...


1、 將基礎類型轉為byte數組存儲

 1  private byte[] CreateNetDataByteStream(ushort system, ushort host, ushort type, byte[] tx_buf, ushort msg_len, ushort flag)
 2 
 3         {
 4 
 5             if (tx_buf == null)
 6 
 7             {
 8 
 9                 return null;
10 
11             }
12 
13             try
14 
15             {
16 
17                 byte[] data = new byte[msg_len + NetDataHeadLen];
18 
19                 byte[] u16byte = new byte[2];
20 
21                 u16byte = BitConverter.GetBytes(type);
22 
23                 Array.Copy(u16byte, 0, data, 0, 2);
24 
25                 u16byte = BitConverter.GetBytes(flag);
26 
27                 Array.Copy(u16byte, 0, data, 4, 2);
28 
29                 u16byte = BitConverter.GetBytes(msg_len);
30 
31                 Array.Copy(u16byte, 0, data, 2, 2);
32 
33                // u16byte = BitConverter.GetBytes(CommonConstant.MySystemID);
34 
35                 Array.Copy(u16byte, 0, data, 6, 2);
36 
37               //  u16byte = BitConverter.GetBytes((ushort)CommonConstant.MySeatName);
38 
39                 Array.Copy(u16byte, 0, data, 8, 2);
40 
41                 u16byte = BitConverter.GetBytes(system);
42 
43                 Array.Copy(u16byte, 0, data, 15, 2);
44 
45                 u16byte = BitConverter.GetBytes(host);
46 
47                 Array.Copy(u16byte, 0, data, 17, 2);
48 
49                 tx_buf.CopyTo(data, NetDataHeadLen);
50 
51                 return data;
52 
53             }
54 
55             catch
56 
57             {
58                 return null;
59 
60             }
61 
62         }

2.C#中結構體 與 位元組流 相互轉化

       

方式一
        //將一個結構序列化為位元組數組
               private IFormatter formatter = new BinaryFormatter();
        private ValueType deserializeByteArrayToInfoObj(byte[] bytes)
        {
            ValueType vt;
            if (bytes == null || bytes.Length == 0)
            {
                return null;
            }

            try
            {
                MemoryStream stream = new MemoryStream(bytes);
                stream.Position = 0;
                stream.Seek(0, SeekOrigin.Begin);
                vt = (ValueType)formatter.Deserialize(stream);
                stream.Close();
                return vt;
            }
            catch (Exception ex)
            {
                return null;
            }
        }
        //將一個結構序列化為位元組數組
        private byte[] serializeInfoObjToByteArray(ValueType infoStruct)
        {
            if (infoStruct == null)
            {
                return null;
            }

            try
            {
                MemoryStream stream = new MemoryStream();
                formatter.Serialize(stream, infoStruct);

                byte[] bytes = new byte[(int)stream.Length];
                stream.Position = 0;
                int count = stream.Read(bytes, 0, (int)stream.Length);
                stream.Close();
                return bytes;
            }
            catch (Exception ex)
            {
                return null;
            }
        }
方式二
   /// <summary>
        /// 將位元組數組轉換為結構體
        /// </summary>
        /// <param name="bytes"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        public object ByteaToStruct(byte[] bytes, Type type)
        {
            //得到結構體大小
            int size = Marshal.SizeOf(type);
            Math.Log(size, 1);

            if (size > bytes.Length)
                return null;
            //分配結構大小的記憶體空間
            IntPtr structPtr = Marshal.AllocHGlobal(size);
            //將BYTE數組拷貝到分配好的記憶體空間
            Marshal.Copy(bytes, 0, structPtr, size);
            //將記憶體空間轉換為目標結構
            object obj = Marshal.PtrToStructure(structPtr, type);
            //釋放內容空間
            Marshal.FreeHGlobal(structPtr);
            return obj;
        }
        /// <summary>
        /// 將結構轉換為位元組數組
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public byte[] StructTOBytes(object obj)
        {
            int size = Marshal.SizeOf(obj);
            //創建byte數組
            byte[] bytes = new byte[size];
            IntPtr structPtr = Marshal.AllocHGlobal(size);
            //將結構體拷貝到分配好的記憶體空間
            Marshal.StructureToPtr(obj, structPtr, false);
            //從記憶體空間拷貝到byte數組
            Marshal.Copy(structPtr, bytes,0, size);
            //釋放記憶體空間
            Marshal.FreeHGlobal(structPtr);
            return bytes;
        }

3. C# 結構體位元組對齊

1 [structLayout(Layoutkind.sequential,charset=charset.ansi)]
2 Struct Mystruct
3 {
4 [MarshalAs(UnmanagedType.ByValArray,sizeConst=8)]
5 Public byte[] serial;
6 Public byte Type;
7 Public uint Sum;
8 }

在上述結構體與位元組流轉換第二種方法中,獲取結構體長度int size = Marshal.SizeOf(Mystruct);,並不是13,而是16。在記憶體特定類型數據結構起始地址通常有一定的對齊要求,比如32位機器的int起始地址必須是4的整數倍,結構通常也如此

需要添加[structLayout(Layoutkind.sequential,charset=charset.ansi,pack=1)]


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近碰見個需求需要實現導出pdf文件,上網查了下代碼資料總結了以下代碼、可以成功的實現導出pdf文件。 在編碼前需要在網上下載個itextsharp.dll,此程式集是必備的。樓主下載的是5.0版本,之前下了個5.4的似乎不好用。 下載之後直接添加引用。 註意代碼中的兩個image圖片,自己可在項目 ...
  • 對於.netCore來說,今年已經推出了正式版,這要求使用vs2015的開發者需要升級到beta3版,而如果使用老版VS開始的.netCore應用程式,它的架構版本將為是測試版"version": "1.0.0-rc2-3002702",而對於這個問題,將會給我們部署帶來麻煩,在一個新的centos ...
  • 一、前言 微軟的Visual Studio非常強大,可以無縫結合Git或自家的TFS(Team Foundation Server),進行項目管理非常方便,從需求分析、開發、測試、維護,幾乎可以貫穿軟體開發的整個生命周期。這篇文章將會詳細介紹如何使用Visual Studio結合TFS進行項目管理。 ...
  • 背景:無意間遇到了一個不大不小的問題,希望對一些遇到的人有所幫助! 一、問題 WinForm DataGridView 綁定泛型List (List)/ArrayList不顯示,UI 代碼如下: using System; using System.Collections.Generic; usin... ...
  • Smobiler是一個在VS環境中使用.Net語言來開發APP的開發平臺,也許比Xamarin更方便 ...
  • 經過近一步完善調整,現將本系統源碼正式開放,定名為:EasyuiAdminFramework,另外EasyuiAdminTemplate及EasyuiFlatTheme也一併開源 項目主頁:http://git.oschina.net/gudufy/easyui-admin-framework 技術 ...
  • 最近研究程式的優化,壓縮html可以減小html的體積,有利於提高頁面的相應速度。在webform的basepage中添加如下代碼: 具體到相應項目當中,還是需要調試以下,以免過濾需要輸出的內容。 ...
  • 對於跨平臺的.netCore來說,讓它的程式運行在Linux系統上已經成為必然,也是一種趨勢,畢竟我們的很多服務都放在linux伺服器上(redis,mongodb,myql,fastDFS,lucene),而我們希望與這些組件服務通訊,需要使用的代碼為java,python等,而這些都不是我們擅長 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...