精华内容
下载资源
问答
  • 结构体属于值类型,存在栈中,在一个对象的主要成员为数据数据量不大的情况下,使用结构会带来更好的性能。 2.2.结构体需要手动释放 属于托管资源,系统自动管理生命周期,局部方法调用完会自动释放,全局方法会...

    1.应用背景
    底端设备有大量网络报文(字节数组):心跳报文,数据采集报文,告警报文上报。需要有对应的报文结构去解析这些字节流数据。

    2.结构体解析
    由此,我第一点就想到了用结构体去解析。原因有以下两点:

    2.1.结构体存在栈中
    类属于引用类型,存在堆中;结构体属于值类型,存在栈中,在一个对象的主要成员为数据且数据量不大的情况下,使用结构会带来更好的性能。

    2.2.结构体不需要手动释放
    属于托管资源,系统自动管理生命周期,局部方法调用完会自动释放,全局方法会一直存在。

    3.封装心跳包结构体
    心跳协议报文如下:
    在这里插入图片描述

    对应结构体封装如下:

    [StructLayout(LayoutKind.Sequential, Pack = 1)] // 按1字节对齐
    public struct TcpHeartPacket
    {
    
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]   //结构体内定长数组
      public byte[] head;
    
      public byte type;
    
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
      public byte[] length;
     
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
      public byte[] Mac;
     
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 104)]
      public byte[] data;//数据体
     
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
      public byte[] tail;
    }
    

    4.结构体静态帮助类
    主要实现了字节数组向结构体转换方法,以及结构体向字节数组的转换方法。

    public class StructHelper
    {
         <summary>
        /// 结构体转byte数组
        /// </summary>
        /// <param name="structObj">要转换的结构体</param>
        /// <returns>转换后的byte数组</returns>
        public static byte[] StructToBytes(Object structObj)
        {
            //得到结构体的大小
            int size = Marshal.SizeOf(structObj);
            //创建byte数组
            byte[] bytes = new byte[size];
            //分配结构体大小的内存空间
            IntPtr structPtr = Marshal.AllocHGlobal(size);
            //将结构体拷到分配好的内存空间
            Marshal.StructureToPtr(structObj, structPtr, false);
            //从内存空间拷到byte数组
            Marshal.Copy(structPtr, bytes, 0, size);
            //释放内存空间
            Marshal.FreeHGlobal(structPtr);
            //返回byte数组
            return bytes;
        }
    
        /// <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);
            try
            {
                //将byte数组拷到分配好的内存空间
                Marshal.Copy(bytes, 0, structPtr, size);
                //将内存空间转换为目标结构体
                return Marshal.PtrToStructure(structPtr, type);
            }
            finally 
            {
                //释放内存空间
                Marshal.FreeHGlobal(structPtr);
            }
    
        }
    
    }
    

    5.New出来的结构体是存在堆中还是栈中?
    有同事说new出来的都会放在堆里,我半信半疑。怎么去确定,new出来的结构体到底放在哪里有两种方式,一种是使用Visual Studio的调试工具查看,这种方法找了好久没找到怎么去查看,路过的高手烦请指点下;第二种方法就是查看反编译dll的IL(Intermediate Language)语言。查看最终是以怎样的方式去实现的。不懂IL想了解IL的可以看此篇文章

    5.1.不带形参的结构体构造
    调用代码
    //初始化结构体
    TcpHeartPacket tcpHeartPacket = new TcpHeartPacket();
    //将上报的心跳报文ReceviveBuff利用结构体静态帮助类StructHelper的BytesToStuct方法将字节流转化成结构体
    tcpHeartPacket = (TcpHeartPacket)StructHelper.BytesToStuct(ReceviveBuff, tcpHeartPacket.GetType());

    从对应的IL代码可以看出只是initobj,并没有newobj,其中newobj表示分配内存,完成对象初始化;而initobj表示vb.net教程对值类型的初始化。

    newobj用于分配和初始化对象;而initobj用于初始化c#教程值类型。因此,可以说,newobj在堆中分配内存,并完成初始化;而initobj则是对栈上已经分配好的内存,进行初始化即可,因此值类型在编译期已经在栈上分配好了内存。

    newobj在初始化过程中会调用构造函数;而initobj不会调用构造函数,而是直接对实例置空。

    newobj有内存分配的过程;而initobj则只完成数据初始化操作。

    initobj 的执行结果是,将tcpHeartPacket中的引用类型初时化为null,而基元类型则置为0。
    综上,new 结构体(无参情况)是放在栈中的,只是做了null/0初始化。

    5.2.带形参的结构体构造
    接下来看下带形参的结构体存放位置。
    简化版带形参的结构体如下:

    public struct TcpHeartPacket
    {
    
        public TcpHeartPacket(byte _type)
        {
            type = _type;
         }
        public byte type;
    
    }
    

    调用如下:

    //带形参结构体new初始化
    TcpHeartPacket tcpHeartPacket = new TcpHeartPacket(0x1);
    //类的new做对比
    IWorkThread __workThread = new WorkThread();
    IL代码如下:
    在这里插入图片描述

    形成了鲜明的对比,new带参的结构体。IL只是去call(调用)ctor(结构体的构造函数),而下面的new类则直接就是newobj,实例化了一个对象存到堆空间去了。

    综合5.1,5.2表明结构体的new确实是存在栈里的,而类的new是存在堆里的。

    6.性能测试
    测试结果如下:

    在这里插入图片描述

    在这里插入图片描述

    使用结构体解析包需要几十个微妙,其实效率还是很差的。我用类封装成包,解析了,只需要几个微妙,性能差5到10倍。

    展开全文
  • 此外,NAS设备采用集中式存储结构,摒弃了DAS的分散存储方式,网络管理员可以方便地管理数据和维护设备。 NAS是在用户的局域网(LAN)上,以文件为单元,进行数据存取,也就是说利用网络文件系统、TCP/IP协议、以太...
  • 通过示例全面而又详细地讲述了oracle 11g的新特性,讲述了更改管理、数据库自动化、性能管理、故障诊断、存储管理、安全管理、性能管理、应用开发、数据仓库等各个方面的改进和创新。通过阅读本书,读者将全面了解...
  • 宏昕医院管理软件,医院收费系统

    热门讨论 2011-04-12 10:16:59
    系统对权限的分配采用等级继承机制控制,即不仅可以对人员分配权限,也可以对组织级即部门或科室级(以下简称科室)分配权限,只要属于某科室下的人员都具有与该科室同等资格的权限,如果科室下某个人员要比同一科室...
  • 采购管理系统需求方案介绍报告 开场白: ...合同的追溯管理功能有效地解决了现行业务中合同执行状态清晰,过程可追溯和跟踪的问题,帮助企业规范和优化了业务流程,避免了采购资金的浪费和流失。
  • (2) 以下数据结构不属于线性数据结构的是(C) A. 队列 B. 线性表 C. 二叉树 D. 栈 (3) 在一棵二叉树上第5层的结点数最多是(B) 注:由公式2k-1得 A. 8 B. 16 C. 32 D. 15 (4) 下面描述中,符合结构化程序设计风格的...
  • (2) 以下数据结构不属于线性数据结构的是______。(C) A. 队列 B. 线性表 C. 二*树 D. 栈 (3) 在一棵二*树上第5层的结点数最多是______。(B) A. 8 B. 16 C. 32 D. 15 (4) 下面描述中,符合结构化程序设计风格的是__...
  • 根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为两大类型:线性结构与非线性结构。 (1)如果一个非空的数据结构满足下列两个条件: ① 有且只有一个根结点; ② 每一个结点最多有一个前件,...
  • •设备管理:实质是对硬件设备的管理,其中包括对输入输出设备的分配、启动、完成和回收; •进程管理:又称处理机管理,实质上是对处理机执行“时间”的管理,即如何将CPU真正合理地分配给每个任务。 4...
  • 计算机网络复习题

    2014-12-29 19:01:35
    (1)为了防止快速的发送设备发出的数据过多,导致慢速的接收设备处理过来而发生大量数据丢失(淹没慢速的接收设备)所采取的限制措施称为流量控制。(3分) (2)在面向连接的TCP协议中,TCP包中有一个Window ...
  •  (47)以下那种攻击不属于主动攻击  A)通信量分析 B) 重放 C) 假冒 D) 拒绝服务攻击  Key: A  (48)在以下网络威胁中,哪个不属于信息泄露  A) 数据窃听 B) 流量分析 C) 拒绝服务攻击 D) 偷窃用户...
  • 会计理论考试题

    2012-03-07 21:04:40
    1.计算机感染病毒后会产生各种现象,以下不属于病毒现象的是__D__。 A、文件占用的空间变大 B、发生异常蜂鸣声 C、屏幕显示异常图形 D、机内的电扇不转 2. Windows98支持下面___C__网络协议。 A、Net BEUI B、IPX...
  • 在该国际标准中,还对智能卡的数据结构以及COS的基本命令集作出了较为详细的说明。至于IS0/IEC78l6-l和2,则是对智能卡的物理参数、外形尺寸作了规定,它们与COS的关系不是很密切。  COS的体系  依赖于上一节中...
  • 嵌入式系统详细文档

    热门讨论 2004-04-28 00:00:00
    目前,在软件中实现与硬件设备数据交换有以下一些方法: 1.编写特定设备的驱动程序。这种方式是最多和最常见的手段,一般使用VC、VB、Delphi的高级语言进行纯粹的程序开发。这种方法不仅可以开发数据采集程序,...
  • 什么是VLAN

    2013-10-23 09:59:12
    由VLAN的特点可知,一个VLAN内部的广播和单播流量都不会转发到其他VLAN中,从而有助于控制流量、减少设备投资、简化网络管理、提高网络的安全性。  交换技术的发展,也加快了新的交换技术(VLAN)的应用速度。通过...
  • 源码分析 :ArrayList 源码+扩容机制分析 、LinkedList 源码 、HashMap(JDK1.8)源码+底层数据结构分析 、ConcurrentHashMap 源码+底层数据结构分析 并发 并发这部分内容非常重要,还是面试中的重点中的重点!但是...
  •  ◇ 概要设计说明书:该说明书是概要实际阶段的工作成果,它应说明功能分配、模块划分、程序的总体结构、输入输出以及接口设计、运行设计、数据结构设计和出错处理设计等,为详细设计提供基础。  ◇ 详细设计说明...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    传统的手工方式对图书信息的管理已越来越能适应社会发展的需要,尤其是随着计算机网络和Internet的普及,运用先进的信息管理系统对信息进行科学化和网络化管理,已成为图书信息管理系统发展的趋势。 系统的研发...
  • 2.3.2 以下属于物理层的设备是? 2.3.3 在以太网中,是根据()地址来区分不同的设备的? 2.3.4 以下为传输层协议的是? 2.3.5 以下对MAC地址描述正确的是? 2.3.6 以下属于数据链路层功能的是? 2.3.7 IEEE802...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    本书着重介绍语言本身,比较少涉及应用,不错的入门书,从头讲起,不怕明白。 <<page 1>> page begin==================== 目 目目 目 录 录录 录 第一部分 C#语言概述.4 第一章 第一章第一章 第...
  • 各种不同特性的功能,规模庞大,便于管理,而且易于受到破坏。 2)分散控制方式 所诮分散控制,粒是在系统的给定状态下,每台处理机只能达到一部分资源,和 只能执行一部分功能。又分为单级多机系统,多级处理机系统和...
  • 源码分析 :ArrayList 源码+扩容机制分析 、LinkedList 源码 、HashMap(JDK1.8)源码+底层数据结构分析 、ConcurrentHashMap 源码+底层数据结构分析 并发 并发这部分内容非常重要,还是面试中的重点中的重点!但是...
  • 源码分析 :ArrayList 源码+扩容机制分析 、LinkedList 源码 、HashMap(JDK1.8)源码+底层数据结构分析 、ConcurrentHashMap 源码+底层数据结构分析 并发 并发这部分内容非常重要,还是面试中的重点中的重点!但是...
  • C#微软培训资料

    2014-01-22 14:10:17
    17.2 文件存储管理 .217 17.3 读 写 文 件 .222 17.4 异步文件操作 .227 17.5 小 结 .234 第十八章 高 级 话 题 .235 18.1 注册表编程 .235 18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 ...
  • 毫不含糊先开启一个子线程来采集数据并将数据存入到内存,再开启一个定期任务的子线程负责从内存中取数据,并将数据存入数据库,有一点需要注意下,内存的数据结构我们用ArrayList实为不妥,多线程中有数据同步的...
  • 在操作系统中,把外部设备也看作是一个文件来进行管理,把它们的输入、输出等同于对磁盘文件的读和写。 通常把显示器定义为标准输出文件, 一般情况下在屏幕上显示有关信息就是向标准输出文件输出。如前面经常使用的...
  • • SQLite SQLite SQLite SQLite 用作结构化的数据存储 • 多媒体支持 包括常见的音频、视频和静态图像格式 (如 MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF) • GSM GSM GSM GSM 电话技术 (依赖于硬件) • ...
  • 5.Neumann计算机属于 驱动方式,数据流计算机属于 驱动方式,归约计算机属于 驱动方式。 四.计算题:(每小题5,共15分) 1.存储器的带宽有何物理意义? 设存储器数据总线宽度为32位,存取周期为250ns,这个存储器...
  • xml入门教程/xml入门教程

    热门讨论 2008-09-07 18:20:03
    字符数据中,能含有&,<,>,',",需要采用实体引用的方式 字符数据段 <![CDATA[字符数据]]> 引用 <!ENTITY 引用名 "......."> 3)杂项 处理指令 XML为其它应用程序准备的接口。 处理指令...
  • iPhone开发秘籍(第2版)--源代码

    热门讨论 2012-12-11 13:51:22
    1.8.6 应用程序束中存在的文件 20 1.8.7 IPA归档 20 1.8.8 沙盒 20 1.9 编程范例 21 1.9.1 面向对象编程 21 1.9.2 模型—视图—控制器 22 1.10 小结 27 第2章 构建第一个项目 28 2.1 创建新项目 28 2.2 ...

空空如也

空空如也

1 2 3
收藏数 58
精华内容 23
关键字:

以下不属于设备管理数据结构

数据结构 订阅