1. 程式人生 > >C# 中 struct 固定長度(Socket報文頭規範)

C# 中 struct 固定長度(Socket報文頭規範)

[MarshalAs(UnmanagedType.I4)]
此屬性標識 int型別 長度為4位元組
int有好幾種:Int16 Int32 Int64
意義同名,分別佔16位,32位,64位
8位一位元組,所以分別佔2位元組,4位元組,8位元組

C#對整數做了基元型別:
short對映Int16
int對映Int32
long對映Int64

int即Int32
即:4位元組
//訊息結構體
    [Serializable]  //  指示可序列化 
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct sMessage
    {
        //聊天主題Id
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 36)]
        public char[] ChatTopicID;


        //聊天訊息Id
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 36)]
        public char[] ChatMessageID;


        //訊息型別 0:錯誤 1:訊息 2:檔案 3:登入 4::獲取登入使用者 5:視窗抖動 6:廣播訊息 7:訊息傳送失敗......
        [MarshalAs(UnmanagedType.I4)]
        public int MsgAction;


        //傳送使用者的Id
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 36)]
        public char[] SendUserID;


        //接收使用者的Id
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 36)]
        public char[] ReceiveUserID;


        //訊息長度 去除頭後的長度
        [MarshalAs(UnmanagedType.I4)]
        public int MsgLen;


        //當前包次序(如果是檔案的話)
        [MarshalAs(UnmanagedType.I4)]
        public int MsgIndex;


        //訊息包的個數 (如果是檔案的話)
        [MarshalAs(UnmanagedType.I4)]
        public int MsgNum;


        //訊息傳送時間 2016-01-11 14:15:01
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 19)]
        public char[] TimeStamp;


        //訊息傳送時間 20160111141501+3位毫秒+(100-999)隨機數 sss (2016-01-11 14:15:01 fff)
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
        public char[] FileName;


        //初始化
        public sMessage(string _ChatTopicID, string _ChatMessageID, string _SendUserID, string _ReceiveUserID, string MsgStr, string _FileName)
        {
            ChatTopicID = _ChatTopicID.ToCharArray();
            ChatMessageID = _ChatMessageID.ToCharArray();
            SendUserID = _SendUserID.ToCharArray();
            ReceiveUserID = _ReceiveUserID.ToCharArray();
            TimeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss").ToCharArray();
            MsgAction = 0;
            MsgNum = 1;
            MsgIndex = 0;
            MsgLen = MsgStr.Length;
            FileName = _FileName.ToCharArray();
        }


    }

相關推薦

C# struct 固定長度(Socket報文規範)

[MarshalAs(UnmanagedType.I4)]此屬性標識 int型別 長度為4位元組int有好幾種:Int16 Int32 Int64意義同名,分別佔16位,32位,64位8位一位元組,所以分別佔2位元組,4位元組,8位元組C#對整數做了基元型別:short對映I

C#Struct與Class的區別

而是 適用於 ack 定義 cts 多態 支持 關鍵字 for class和struct最本質的區別是class是引用類型,而struct是值類型,它們在內存中的分配情況有所區別。 什麽是class? class(類)是面向對象編程的基本概念,是一種自定義數據結構類型,通

淺析內存對齊與ANSI Cstruct型數據的內存布局

開發 分析 clas type spa 速度 嚴格 通過 取數據 這些問題或許對不少朋友來說還有點模糊,那麽本文就試著探究它們背後的秘密。 首先,至少有一點可以肯定,那就是ANSI C保證結構體中各字段在內存中出現的位置是隨它們的聲明順序依次遞增的,並且第一個字段的首地址等

C如何定義長度為1000000的整型陣列

int n[1000000];這樣肯定是不行的,因為這樣定義的陣列用的是棧記憶體,系統預設值為最大1Mb,一個int型佔4位元組這樣最大可以申請1024*1024/4=264144個,如果考慮到系統自身的佔用最大值約為25000個。int *p=(int )malloc(1000000siz

C++struct和class定義類的區別

C++中的struct對C中的struct進行了擴充,它已經不再只是一個包含不同資料型別的資料結構了,它已經獲取了太多的功能。struct能包含成員函式嗎? 能! struct能繼承嗎? 能!! struct能實現多型嗎? 能!!!  既然這些它都能實現,那它和clas

例項理解c++向前宣告與引用標檔案的區別

使用C++程式設計,編譯時經常出現這種錯誤"error: invalid use of incomplete type ‘class xxx’",或“error: forward declaration of ‘class xxx’”. 解決這種錯誤就是用理解c++中向前宣告與引用標頭檔案的

(轉)C#數字轉固定長度的字串

關於數字右對齊和用0填充格式化字串的方法 在向檔案或者報表輸出數字的時候,固定字串的長度向右對齊,用0填充其餘空間的情況很常見。在這種情況下,使用String類(System名稱空間)的Format方法就很方便。 Format方法可以用引數設定字串的格式以及指定相應

C++struct也有建構函式與解構函式,也可以有訪問型別控制以及結構體大小,類大小

C++中struct也有建構函式與解構函式,也可以有訪問型別控制,可以用private關鍵字。如下所示: #include <iostream> struct point { public: point():x_(0.0),y_(0.0

C#取得指定長度的字串

我們知道,在C#(.Net)內部所使用Unicode來儲存字串,這樣在處理字串的時候偶爾會發生一些不爽的事情。比如,如果字串中有中文字元,而我們想取得固定長度字串就頗為麻煩,下面提供了一個解決方案。在這

C++TCP/IP按約定報文協議接收資料完成拼包

有段時間沒有更新部落格了,近來比較忙,沒有顧上寫部落格。終於完成了一個大任務,有時間回顧一下這段時間的成果。這篇部落格,先介紹和總結一下很久前的工作。TCP/IP接收資料拼包。由於時間太長很多東西記不清楚了,請見諒。 任務是某裝置通過WIFI以TCP/IP的協議傳送影象資料

C/C++ struct巢狀的記憶體分配

一、概述         一直只知道非巢狀結構體的記憶體分配大小,卻沒想過如果結構體有巢狀怎麼辦?星期二參加360的筆試碰到了這樣的題目,自然也就答不上來。今天編碼試了下,得出了結論,在此記錄下。這裡主要探討兩點,非巢狀結構體的記憶體分配問題和結構體巢狀的記憶體分配問題。第

C#struct的位元組對齊、轉換操作和複製為二進位制資料(byte[])

在做C#與其它程式通訊的系統時,往往會使用struc操作結構化的資料(如資料包等)。 本文簡要提出一些使用思路,歡迎各位大牛賜教。 一、STRUCT結構設計 當資料的結構確定時,總結為下面兩種情況: 1、資料長度確定(包括字串): 此時可以直接利用struct

C++固定分隔符分割CString字串

CString * SplitString(CString str, char split, int& iSubStrs) { int iPos = 0; //分割符位置 int iNums = 0; //分割符的總數 CString str

c++兩個類的標檔案互相包含編譯出錯的解決辦法

首先我們需要問一個問題是:為什麼兩個類不能互相包含標頭檔案? 所謂互相包含標頭檔案,我舉一個例子:我實現了兩個類:圖層類CLayer和符號類CSymbol,它們的大致關係是圖層裡包含有符號,符號裡定義一個相關圖層指標,具體請參考如下程式碼(注:以下程式碼僅供說明問題,不作為

php截取富文本框固定長度的字符

con col ... decode sub bst 記得 內容 nts ai,哎怎麽趕腳自己寫東西越來越小兒科了呢,現在連這個問題都找了好半天 因為後臺是的內容是富文本編輯器編輯的,前臺我傻逼的直接截取了字符串,然後樣式啥的都亂了,找了半天是因為富文本的問題 其實解決

C# Struct 和 Class 的區別總結

> 翻譯自 Manju lata Yadav 2019年6月2日 的博文 [《Difference Between Struct And Class In C#》](https://www.c-sharpcorner.com/blogs/difference-between-struct-and-cla

C語言struct長度可變數組(Flexible array member)

wing art arr item 1 eof AI clas follow erro C_struct中的長度可變數組(Flexible array member) Flexible array member is a feature introduced in the

C++類單鏈表的實現(插、尾插、刪、尾刪、指定位置插入、指定位置刪除、連結串列長度、清空連結串列、連結串列排序)

#include<iostream> using namespace std; class Node { public:Node():next(NULL){}Node(int n,Node *p = NULL):value(n),next(p){}int val

Scrapy基礎————將不定長度的URL進行固定長度寫入Item

util img dig style lib 定義 項目 不存在 spa 前面講到將每篇文章的URL寫入Item,但是每個url的長度是不同的,可以在Item中設置一個字段怎樣使得每個URL的長度相同,這就需要對每個URL進行md5運算,使得長度統一,再加入到設定的It

C++sizeof(struct)怎麽計算?(轉)

color 發現 pre blank str io7 bsp com 說明 struct為空時,大小為1. 1、 sizeof應用在結構上的情況 請看下面的結構: 1 struct MyStruct 2 { 3 double dda1; 4 char dda; 5 int