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文档:
Marshalling .NET generic types
与其它语言Struct通信时:
C#调用C++DLL传递结构体数组的终极解决方案_学而时习之-CSDN博客
C#接收C/C++DLL的结构体嵌套数组及多维数组的解决方案_学而时习之-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# | ||
|---|---|---|---|
| WORD | ushort | ||
| DWORD | uint | ||
| UCHAR | int/byte(大多数情况下都可以使用int代替,而如果需要严格对齐使用byte) | ||
| UCHAR* | string/IntPtr | ||
| unsigned char * | [MarshalAs(UnmanagedType.LPArray)]byte[]/?(Intptr) | ||
| char* | string | ||
| LPCTSTR | string | ||
| LPTSTR | [MarshalAs(UnmanagedType.LPTStr)] string | ||
| long | int | ||
| ulong | uint | ||
| Handle | IntPtr | ||
| HWND | IntPtr | ||
| void * | IntPtr | ||
| int | int | ||
| int* | ref int | ||
| *int | IntPtr | ||
| unsigned int | uint | ||
| COLORREF | uint |
参考:
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个字节
删除、复制、转换