C#结构体数组间的转化
转自:http://developer.51cto.com/art/200908/143779.htm
解决C#结构体数组间的转化问题的由来:在写C#TCP通信程序时,发送数据时,如果是和VC6.0等写的程序通信的话,很多的都是传送结构体,在VC6.0中可以很方便的把一个char[]数组转换为一个结构体,而在C#却不能直接把byte数组转换为结构体,要在C#中发送结构体,可以按以下方法实现:
(1)解决C#结构体数组间的转化之定义结构体:
- //命名空间
 - using System.Runtime.InteropServices;
 - //注意这个属性不能少
 - [StructLayoutAttribute(
 - LayoutKind.Sequential,
 - CharSet=CharSet.Ansi,Pack=1)]
 - struct TestStruct
 - ...{
 - public int c;
 - //字符串,SizeConst为字符串的最大长度
 - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
 - public string str;
 - //int数组,SizeConst表示数组的个数,在转换成
 - //byte数组前必须先初始化数组,再使用,初始化
 - //的数组长度必须和SizeConst一致,例test = new int[6];
 - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
 - public int[] test;
 - }
 
(2)解决C#结构体数组间的转化之byte数组转结构体:
- /**//// <summary>
 - /// byte数组转结构体
 - /// </summary>
 - /// <param name="bytes">byte数组</param>
 - /// <param name="type">结构体类型</param>
 - /// <returns>转换后的结构体</returns>
 - public static object BytesToStuct(byte[] bytes,Type type)
 - ...{
 - //得到结构体的大小
 - int size = Marshal.SizeOf(type);
 - //byte数组长度小于结构体的大小
 - 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;
 - }
 
解决C#结构体数组间的转化的相关内容就向你介绍到这里,希望对你学习和了解解决C#结构体数组间的转化方法有所帮助。
C#结构体数组间的转化的更多相关文章
- C#调用C/C++动态库 封送结构体,结构体数组
		
一. 结构体的传递 #define JNAAPI extern "C" __declspec(dllexport) // C方式导出函数 typedef struct { int ...
 - 【C语言入门教程】7.2 结构体数组的定义和引用
		
7.2 结构体数组的定义和引用 当需要使用大量的结构体变量时,可使用结构体定义数组,该数组包含与结构体相同的数据结构所组成的连续存储空间.如下例所示: struct student stu_a[50] ...
 - Delphi结构体数组指针的问题
		
//这段代码在Delphi 2007和delphi 7下是可以执行的,所以正确使用结构体数组和指针应该是这样的,已验证 unit Unit1; interface uses Windows, Mess ...
 - C语言中的结构体,结构体数组
		
C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存 ...
 - 结构体数组(C++)
		
1.定义结构体数组 和定义结构体变量类似,定义结构体数组时只需声明其为数组即可.如: struct Student{ int num; char name[20]; char sex[5]; int ...
 - c语言学习之基础知识点介绍(十七):写入读取结构体、数组、结构体数组
		
一.结构体的写入和读取 //写入结构体 FILE *fp = fopen("/Users/ios/Desktop/1.data", "w"); if (fp) ...
 - c语言结构体数组定义的三种方式
		
struct dangdang { ]; ]; ]; int num; int bugnum; ]; ]; double RMB; int dangdang;//成员名可以和类名同名 }ddd[];/ ...
 - C#调用C++DLL传递结构体数组的终极解决方案
		
在项目开发时,要调用C++封装的DLL,普通的类型C#上一般都对应,只要用DllImport传入从DLL中引入函数就可以了.但是当传递的是结构体.结构体数组或者结构体指针的时候,就会发现C#上没有类型 ...
 - 绝对好文C#调用C++DLL传递结构体数组的终极解决方案
		
C#调用C++DLL传递结构体数组的终极解决方案 时间 2013-09-17 18:40:56 CSDN博客相似文章 (0) 原文 http://blog.csdn.net/xxdddail/art ...
 
随机推荐
- 基于Promise对象的新一代Ajax API--fetch
			
***************************************************************** #fetch Request 使用isomorphic-fetch发 ...
 - CreateWindow创建无边框 可拉伸窗体
			
createwindow 定义 HWND WINAPI CreateWindow( _In_opt_ LPCTSTR lpClassName, _In_opt_ LPCTSTR lpWindowNam ...
 - C++中int转为char 以及int 转为string和string 转int和字符串的split
			
1.对于int 转为char 直接上代码: 正确做法: void toChar(int b) { char u; ]; _itoa( b, buffer, ); //正确解法一 u = buffer[ ...
 - libc.so.6(GLIBC_2.14)(64bit) is needed by MySQL
			
记一次粗心大意!解决办法在最下面! rpm安装MySQL时提升如下: warning: MySQL-client-5.6.41-1.el7.x86_64.rpm: Header V3 DSA/SHA1 ...
 - AI理论学习笔记(一):深度学习的前世今生
			
AI理论学习笔记(一):深度学习的前世今生 大家还记得以深度学习技术为基础的电脑程序AlphaGo吗?这是人类历史中在某种意义的第一次机器打败人类的例子,其最大的魅力就是深度学习(Deep Learn ...
 - orecle常用函数
			
Oracle SQL 提供了用于执行特定操作的专用函数.这些函数大大增强了 SQL 语言的功能.函数可以接受零个或者多个输入参数,并返回一个输出结果. oracle 数据库中主要使用两种类型的函数 1 ...
 - SQL Server2012在软件开发中的一些新特性
			
官方给出了一大堆SQL2012相对于SQL2008R2的新特性,但是大多数对于普通开发人员来说都是浮云,根本用不到,下面就说说一些对于开发人员来说比较有用的新特性. 一.在SQL Server中终 ...
 - eclipse里启动rabbitmq报错 java.net.SocketException: Connection reset
			
RabbitMQ学习之Java客户端连接测试(二) https://blog.csdn.net/roc1029/article/details/51249412 使用guest用户远程连接Rabbit ...
 - Flume-NG源码阅读之FileChannel
			
FileChannel是flume一个非常重要的channel组件,非常常用.这个channel非常复杂,涉及的文件更多涉及三个包:org.apache.flume.channel.file.org. ...
 - Nginx的长链接
			
网站使用程序discuz3访问都正常,只有用户登录存在异常,具体就是:用户登陆后会马上显示未登录,然后刷新一下又变成了登录中 这个问题的原因显然是由于session导致,后台有多个web机器,当用户登 ...