转自:http://developer.51cto.com/art/200908/143779.htm

解决C#结构体数组间的转化问题的由来:在写C#TCP通信程序时,发送数据时,如果是和VC6.0等写的程序通信的话,很多的都是传送结构体,在VC6.0中可以很方便的把一个char[]数组转换为一个结构体,而在C#却不能直接把byte数组转换为结构体,要在C#中发送结构体,可以按以下方法实现:

(1)解决C#结构体数组间的转化之定义结构体:

  1. //命名空间
  2. using System.Runtime.InteropServices;
  3. //注意这个属性不能少
  4. [StructLayoutAttribute(
  5. LayoutKind.Sequential,
  6. CharSet=CharSet.Ansi,Pack=1)]
  7. struct TestStruct
  8. ...{
  9. public int c;
  10. //字符串,SizeConst为字符串的最大长度
  11. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
  12. public string str;
  13. //int数组,SizeConst表示数组的个数,在转换成
  14. //byte数组前必须先初始化数组,再使用,初始化
  15. //的数组长度必须和SizeConst一致,例test = new int[6];
  16. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
  17. public int[] test;
  18. }

(2)解决C#结构体数组间的转化之byte数组转结构体:

  1. /**//// <summary>
  2. /// byte数组转结构体
  3. /// </summary>
  4. /// <param name="bytes">byte数组</param>
  5. /// <param name="type">结构体类型</param>
  6. /// <returns>转换后的结构体</returns>
  7. public static object BytesToStuct(byte[] bytes,Type type)
  8. ...{
  9. //得到结构体的大小
  10. int size = Marshal.SizeOf(type);
  11. //byte数组长度小于结构体的大小
  12. if (size > bytes.Length)
  13. ...{
  14. //返回空
  15. return null;
  16. }
  17. //分配结构体大小的内存空间
  18. IntPtr structPtr = Marshal.AllocHGlobal(size);
  19. //将byte数组拷到分配好的内存空间
  20. Marshal.Copy(bytes,0,structPtr,size);
  21. //将内存空间转换为目标结构体
  22. object obj = Marshal.PtrToStructure(structPtr, type);
  23. //释放内存空间
  24. Marshal.FreeHGlobal(structPtr);
  25. //返回结构体
  26. return obj;
  27. }

解决C#结构体数组间的转化的相关内容就向你介绍到这里,希望对你学习和了解解决C#结构体数组间的转化方法有所帮助。

C#结构体数组间的转化的更多相关文章

  1. C#调用C/C++动态库 封送结构体,结构体数组

    一. 结构体的传递 #define JNAAPI extern "C" __declspec(dllexport) // C方式导出函数 typedef struct { int ...

  2. 【C语言入门教程】7.2 结构体数组的定义和引用

    7.2 结构体数组的定义和引用 当需要使用大量的结构体变量时,可使用结构体定义数组,该数组包含与结构体相同的数据结构所组成的连续存储空间.如下例所示: struct student stu_a[50] ...

  3. Delphi结构体数组指针的问题

    //这段代码在Delphi 2007和delphi 7下是可以执行的,所以正确使用结构体数组和指针应该是这样的,已验证 unit Unit1; interface uses Windows, Mess ...

  4. C语言中的结构体,结构体数组

    C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存 ...

  5. 结构体数组(C++)

    1.定义结构体数组 和定义结构体变量类似,定义结构体数组时只需声明其为数组即可.如: struct Student{ int num; char name[20]; char sex[5]; int ...

  6. c语言学习之基础知识点介绍(十七):写入读取结构体、数组、结构体数组

    一.结构体的写入和读取 //写入结构体 FILE *fp = fopen("/Users/ios/Desktop/1.data", "w"); if (fp) ...

  7. c语言结构体数组定义的三种方式

    struct dangdang { ]; ]; ]; int num; int bugnum; ]; ]; double RMB; int dangdang;//成员名可以和类名同名 }ddd[];/ ...

  8. C#调用C++DLL传递结构体数组的终极解决方案

    在项目开发时,要调用C++封装的DLL,普通的类型C#上一般都对应,只要用DllImport传入从DLL中引入函数就可以了.但是当传递的是结构体.结构体数组或者结构体指针的时候,就会发现C#上没有类型 ...

  9. 绝对好文C#调用C++DLL传递结构体数组的终极解决方案

    C#调用C++DLL传递结构体数组的终极解决方案 时间 2013-09-17 18:40:56 CSDN博客相似文章 (0) 原文  http://blog.csdn.net/xxdddail/art ...

随机推荐

  1. Python3:自动发送账单邮件

    Python3:自动发送账单邮件 一.前言 民间借贷,没有信用卡那样,每月会收到账单:为了民间借贷管理更加合理化,写了个还款账单小程序. 二.源码 (1)配置文件代码: [dbmysql] ip = ...

  2. Oracle11g:分区表数据操作出现ORA-14400异常处理

    Oracle11g:分区表数据操作出现ORA-14400异常处理 问题: 当对已分区的表数据进行操作(例如新增,修改),出现异常提示: ORA: 插入的分区关键字未映射到任何分区 分析: 意思说的是插 ...

  3. [pixhawk笔记]3-架构概览

    本文主要内容翻译自:https://dev.px4.io/en/concept/architecture.html 总体架构: PX4代码由两层组成:PX4飞行栈和PX4中间件.其中,前者是一套飞行控 ...

  4. 20145109 《Java程序设计》第八周学习总结

    Chapter 15 API java.util.logging package The constructor of Logger class is protected. If Logger ins ...

  5. php上传文件后无法移动到指定目录的解决

    从浏览器访问而触发PHP脚本运行的用户是 apache 用户 无法移动文件的原因主要是目标目录没有写入权限 1.将目标目录权限设置为 777 #chmod 777 tar_dir 2.将目标目录用户和 ...

  6. LeetCode——Max Consecutive Ones

    LeetCode--Max Consecutive Ones Question Given a binary array, find the maximum number of consecutive ...

  7. 2017 湘潭邀请赛&JSCPC G&J

    训练的时候对G想了一个假算法..也有很大可能是写错了.. 下来一看别人的G 看起来很奇妙.. 开始把所有的左括号翻成右括号,然后cost*=-1 这样在优先队列中就是最优的 然后for每一段 如果前缀 ...

  8. scala学习手记5 - 元组与多重赋值

    假定要在一个方法中返回多个值.比如需要返回一个人的名.姓和邮箱地址.在Java中最常用的方法是定义一个Person类,其中包括相对应的字段:还有些不常用的方法就是返回一个集合或数组,拿到结果后再进行循 ...

  9. thinkphp接收阿里淘宝客数据

    坑在于淘宝客api返回的数据对象是SimpleXMLElement Object类型,不转为php的json array类型数据直接扔到thinkphp循环输出中会达不到要的效果,奇奇怪怪的数组,一度 ...

  10. docker定义数据卷及数据卷的备份恢复

    前言:生产环境中使用docker时,往往需要对数据进行持久化(只有把容器导出为镜像,才能够保存写的数据,否则容器删除或者停止,所有数据都会没有),或者需要在多个容器之间进行数据共享,这必然涉及容器的数 ...