C++中定义结构如下,需要转化成C#的结构

typedef struct tagNET_DVR_CID_ALARM
{
    DWORD dwSize;
    BYTE sCIDCode[CID_CODE_LEN/*4*/]; //CID事件号
    BYTE sCIDDescribe[NAME_LEN/*32*/]; //CID事件名
    NET_DVR_TIME_EX struTriggerTime;   //触发报警的时间点
    NET_DVR_TIME_EX struUploadTime;    //上传报警的时间点
    BYTE sCenterAccount[ACCOUNTNUM_LEN/*6*/]; //中心帐号
    BYTE byReportType;     //见定义NET_DVR_ALARMHOST_REPORT_TYPE
    BYTE byUserType;      //用户类型,0-网络用户 1-键盘用户,2-手机用户,3-系统用户
    BYTE sUserName[NAME_LEN/*32*/];  //网络用户用户名
    WORD wKeyUserNo;      //键盘用户号 0xFFFF表示无效
    BYTE byKeypadNo;      //键盘号  0xFF表示无效
    BYTE bySubSysNo;      //子系统号  0xFF表示无效
    WORD wDefenceNo;      //防区号  0xFFFF表示无效
    BYTE byVideoChanNo;     //视频通道号 0xFF表示无效
    BYTE byDiskNo;      //硬盘号  0xFF表示无效
    WORD wModuleAddr;     //模块地址  0xFFFF表示无效
    BYTE byCenterType;     //0-无效, 1-中心账号(长度6),2-扩展的中心账号(长度9)
    BYTE byRes1;
    BYTE sCenterAccountV40[ACCOUNTNUM_LEN_32/*32*/]; //中心账号V40,使用此字段时sCenterAccount无效
    BYTE byRes2[28];
}NET_DVR_CID_ALARM, *LPNET_DVR_CID_ALARM;

C++结构中有指定长度的BYTE数组,C#中的实现如下:

[StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_DVR_CID_ALARM
        {
            public uint dwSize;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] sCIDCode;   //CID事件号
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
            public byte[] sCIDDescribe;  //CID事件名
            NET_DVR_TIME_EX struTriggerTime;            //触发报警的时间点
            NET_DVR_TIME_EX struUploadTime;             //上传报警的时间点
            public byte sCenterAccount;   //中心帐号
            public Byte byReportType;                  //见定义NET_DVR_ALARMHOST_REPORT_TYPE
            public Byte byUserType;                        //用户类型,0-网络用户 1-键盘用户,2-手机用户,3-系统用户
            public byte sUserName;     //网络用户用户名
            public ushort wKeyUserNo;                        //键盘用户号 0xFFFF表示无效
            public Byte byKeypadNo;                        //键盘号  0xFF表示无效
            public Byte bySubSysNo;                        //子系统号  0xFF表示无效
            public ushort wDefenceNo;                        //防区号  0xFFFF表示无效
            public Byte byVideoChanNo;                 //视频通道号 0xFF表示无效
            public Byte byDiskNo;                      //硬盘号  0xFF表示无效
            public ushort wModuleAddr;                   //模块地址  0xFFFF表示无效
            public Byte byCenterType;                  //0-无效, 1-中心账号(长度6),2-扩展的中心账号(长度9)
            public Byte byRes1;
            public byte sCenterAccountV40;    //中心账号V40,使用此字段时sCenterAccount无效
            public byte byRes2;
        }

用[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]加到变量前面,指定数组长度

C#内存复制结构的更多相关文章

  1. 【转载】HTTP Session 内存到内存复制的拓扑结构

    http://www.oschina.net/question/129540_23215 HTTP 协议本身是“连接 - 请求 - 应答 - 关闭连接”的模式,是一种无状态协议:然而随着 web 动态 ...

  2. nginx源码分析—内存池结构ngx_pool_t及内存管理

    Content 0. 序 1. 内存池结构 1.1 ngx_pool_t结构 1.2 其他相关结构 1.3 ngx_pool_t的逻辑结构 2. 内存池操作 2.1 创建内存池 2.2 销毁内存池 2 ...

  3. 关于fork函数中的内存复制和共享

    原来刚刚开始做linux下面的多进程编程的时候,对于下面这段代码感到很奇怪, #include<unistd.h> #include<stdio.h> #include< ...

  4. Java对象在内存的结构

    一.内存布局 对象在内存中存储的结构由三部分组成:对象头.实例数据.对齐填充. 对象头 MarkWord(标记字段):哈希码.分代年龄.锁标志位.偏向线程ID.偏向时间戳等信息.Mark Word被设 ...

  5. 深入理解JVM虚拟机1:JVM内存的结构与永久代的消失

    所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问 ...

  6. postgresql 用 like 可以 复制结构包括主键约束

    create tabletablename ( like tablename INCLUDING INDEXES INCLUDING COMMENTS); PostgreSQL 动态表复制(CREAT ...

  7. 深入理解JVM虚拟机1:JVM内存的结构与消失的永久代

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutori ...

  8. malloc分配内存的结构

    在C/C++,我们都可以使用malloc进行分配大小,单位是字节.   malloc实际分配的内存大小和传入的参数其实是不同的.   实际分配的内存大小>传入的参数大小. malloc分配的内存 ...

  9. 2014年1月9日 Oracle 内存与结构

    Oracle启动时为启动一个实例 主要为 实例 SVG 数据库文件 其它文件 1.Oracle:  内存 进程  其他文件 1.1 SVG内存(Cache)  1.1.1 共享池(Shared Poo ...

随机推荐

  1. jar包读取配置文件

    读取jar包内配置文件: Properties config = new Properties(); InputStream in = this.getClass().getClassLoader() ...

  2. X-Frame-Options配置

    因为最近项目需要接入数据统计,其中一项功能需要开启iframe形式来加载页面,所以就开始研究一下iframe如何配置~~~ X-Frame-Options: 他的值有三个: (1)DENY --- 表 ...

  3. 在ASPNETCORE中获得所有Action

    在ASPNETCORE中获得所有Action 本文旨在记录自己在aspnetcore工作中需要获取所有Action,在查询了资料后进行了几种方法的记录.后期有发现其它方式再进行追加. 一.通过 反射 ...

  4. SQL 文件以及文件组

    1.SQL Server根据分区表名查找所在的文件及文件组实现脚本 --SQL Server根据分区表名查找所在的文件及文件组实现脚本 SELECT fg.name AS FileGroupName ...

  5. linq中where与skipwhile区别

    //字符串数组 string[] names = { "a1", "a2", "bcd","ab","bcde ...

  6. unity 中 protobuff 的用法 一句话攻略

    (一)unity 添加 pb 的 dll 支持.1,从GitHub上下载protobuf源码 (源码链接:https://github.com/google/protobuf),找到 csharp 分 ...

  7. sublime快捷键大全(转)

    文件 File 新建文件 Ctrl + N 打开文件 Ctrl + O 打开最近关闭的文件 Ctrl + Shift + T 保存 Ctrl + S 另存为… Ctrl + Shift + S 关闭文 ...

  8. Node.js学习笔记(五) --- 使用Node.js搭建Web服务器

    1. Node.js 创建的第一个应用 1.引入http模块 var http = require("http"); 2. 创建服务器接下来我们使用 http.createServ ...

  9. [javaEE] EL表达式获取数据

    jsp标签: <jsp:include> <jsp:forward> 实现请求转发 <jsp:param> 给上面的添加参数的 EL表达式: 1.获取变量数据 &l ...

  10. 二:Vim常用命令

    一般模式下的命令: -- 插入命令 i 光标前插入 I 当前行开始 o 下一行 O 上一行插入新行 a 光标后插入 A 当前行末尾 -- 定位命令 :set nu 显示行号 :set nonu 取消行 ...