Socket解包基础-c#

739 阅读2分钟

1. byte[]转换,以占字节数进行

使用BitConverter类进行转换。

//int a =1; 转为4字节的 byte[] = new byte[4];
int a = 1;
byte[] rets = BitConverter.GetBytes(a); 
Console(rets.Length);			//结果为 4

API文档:BitConverter 类 (System) | Microsoft Docs

2. string 与 byte[] 转换

API文档:Encoding 类 (System.Text) | Microsoft Docs

3. Array 数组间的 Copy

//此处将agreement、childAgreement、bytes拼接成一个content
//agreement		4字节
//childAgreement	4字节
//bytes		4字节
//content		12字节

byte[] agreement = BitConverter.GetBytes(1);         //CAXADNC西门子数据协议
byte[] childAgreement = BitConverter.GetBytes(1);           //西门子数据协议版本1
byte[] bytes = BitConverter.GetBytes(7);          //命令

byte[] content = new byte[12];           //整个命令内容           

Array.Copy(agreement, 0, content, 0, 4);
Array.Copy(childAgreement, 0, content, 4, 4);
Array.Copy(bytes, 0, content, 7, 4);

API文档:Array.Copy 方法 (System) | Microsoft Docs

4.Struct 与 byte[] 之间的转换

参考:C#中struct的字节对齐、转换操作和复制为二进制数据(byte[])

5.获取Struct结构体大小

使用Marshal.SizeOf Method来获取Struct占的字节数。

API文档:

Marshal.SizeOf Method

MarshalAs的使用

Marshalling .NET generic types

与其它语言Struct通信时:

C#调用C++DLL传递结构体数组的终极解决方案_学而时习之-CSDN博客

C#接收C/C++DLL的结构体嵌套数组及多维数组的解决方案_学而时习之-CSDN博客

MarshalAs的简单总结_钢铁男儿-CSDN博客

经典:

MarshalAs的使用_发展是曲折的但也是前进的-CSDN博客

使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明_Donjuan的专栏-CSDN博客

推荐一个好工具:P/Invoke Interop Assistant【转】 - 3D入魔 - 博客园 (cnblogs.com)

c# - Easiest way to generate P/Invoke code? - Stack Overflow

工具下载地址:

PInvokeInteropAssistant.zip - 蓝奏云 (lanzoui.com)

6.byte[] 与 16 进制字符串

参考博文:

C# byte数组与16进制字符串相互转化_elie_yang的博客-CSDN博客

7.c#与c++类型对照表

C++C#
WORDushort
DWORDuint
UCHARint/byte(大多数情况下都可以使用int代替,而如果需要严格对齐使用byte)
UCHAR*string/IntPtr
unsigned char *[MarshalAs(UnmanagedType.LPArray)]byte[]/?(Intptr)
char*string
LPCTSTRstring
LPTSTR[MarshalAs(UnmanagedType.LPTStr)] string
longint
ulonguint
HandleIntPtr
HWNDIntPtr
void *IntPtr
intint
int*ref int
*intIntPtr
unsigned intuint
COLORREFuint

参考:

C# 和 C++ 数据类型对照表 - kuiblog.com - 博客园 (cnblogs.com)

C++ 与 C#数据结构类型对应关系表 - sunrack - 博客园 (cnblogs.com)

c与c#数据类型对应关系 - lazyman - 博客园 (cnblogs.com)

8. byte[] 字节操作

截取

 byte[] data = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 BitConverter.ToInt32(data,3);           //从第3位开始截取4个字节
 data.Skip(5).Take(3).ToArray();        //从第5位开始截取3个字节  

删除、复制、转换

C# 字节数组截取 - 大胖熊猫 - 博客园 (cnblogs.com)

C# Byte[]使用总结 - 简书 (jianshu.com)