c# - 如何将结构数组转换为二进制数组C#
问题描述
在这里,我有两种方法可以将 struct 解析为 byte[] ,并将 byte[] 解析为 struct 。
那么如何将“结构数组”解析为字节数组,并将字节数组解析为结构数组。像这样:
byte[] getBytes<T>(T[] str) where T : struct
T[] fromBytes<T>(byte[] byte) where T : struct
//---- 这里是 struct 到 byte[] --- byte[] 到 struct ---
byte[] getBytes<T>(T str) where T : struct
{
int size = Marshal.SizeOf(str);
byte[] arr = new byte[size];
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(str, ptr, true);
Marshal.Copy(ptr, arr, 0, size);
Marshal.FreeHGlobal(ptr);
return arr;
}
T fromBytes<T>(byte[] arr) where T : struct
{
T str = new T();
int size = Marshal.SizeOf(str);
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(arr, 0, ptr, size);
str = (T)Marshal.PtrToStructure(ptr, str.GetType());
Marshal.FreeHGlobal(ptr);
return str;
}
解决方案
我找到了解决方案。
T[] GetStructs<T>(byte[] arr) where T : struct
{
int size = Marshal.SizeOf(default(T));
int len = arr.Length / size;
T[] result = new T[len];
IntPtr ptr = Marshal.AllocHGlobal(size);
for (int i = 0; i < len; ++i)
{
Marshal.Copy(arr, i * size, ptr, size);
result[i] = (T)Marshal.PtrToStructure(ptr, typeof(T));
}
Marshal.FreeHGlobal(ptr);
return result;
}
byte[] GetBytes<T>(T[] structAry) where T : struct
{
int len = structAry.Length;
int size = Marshal.SizeOf(default(T));
byte[] arr = new byte[size * len];
IntPtr ptr = Marshal.AllocHGlobal(size);
for (int i = 0; i < len; ++i)
{
Marshal.StructureToPtr(structAry[i], ptr, true);
Marshal.Copy(ptr, arr, i * size, size);
}
Marshal.FreeHGlobal(ptr);
return arr;
}
推荐阅读
- angular - 日历 PrimeNG 不起作用
- c++ - qt 从 QChart 获取孩子(标注)
- google-app-engine - 是否需要旧版云存储权限?
- react-native - React Native 实现类似 CSS 分词的样式:break-all
- azure-data-factory - 数据工厂服务主体的 ACL 验证失败,尽管它具有 rwx 权限
- azure - 为 kubernetes 负载均衡器分配一个来自内部网络的 ip
- php - PHPExcel getRowIterator() 和行序列
- python - OpenCV 背景减法以改善检测
- powerbi - 复制现有 Power BI 页面并将数据源更改为不同的查询
- android - 状态栏上的Android默认返回操作