提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

VB.net小技巧——VB.net中的结构体和共用体

  • 前言
  • 结构体和共用体的定义
  • 一个完整的程序示例
  • 下位机和上位机浮点传输示例
    • 下位机示例
    • 上位机示例

前言

在C语言中,有一种类型名为共用体,关键字为union,它与结构体十分类似,但是它所有的数值全都指向同一个指针。也就是说,当你修改共用体内的某一个数据时,其他数据也会同时改变。
这个类型的好处,在于可以存储某种不确定的数据对象,等到稍后再来分析出该对象的用途。
这个对于数制的转换和传输非常有用。
在之前的VB6.0中,我使用的是CopyMemory的方法,但在现在的VB.net中这里有了新的变化,在这里记录一下

结构体和共用体的定义

union MyUnion
{char b; //单字节整数,在c语言中用char类型来表示单字节整数short s; //双字节整数int i; //四字节整数
}

在 .net 中使用联合体,我们只需要声明一个普通的结构体,然后在结构体上使用属性描述即可。

结构体:

    Structure MyStructDim b0 As ByteDim b1 As ByteDim b2 As ByteDim b3 As ByteDim s As ShortDim us As UShortDim i As IntegerDim ui As UIntegerEnd Structure

联合体:

Imports System.Runtime.InteropServices'引入运行时非托管数据管理服务<StructLayout(LayoutKind.Explicit)> _Structure MyUnion<FieldOffset(0)> Dim b0 As Byte<FieldOffset(1)> Dim b1 As Byte<FieldOffset(2)> Dim b2 As Byte<FieldOffset(3)> Dim b3 As Byte<FieldOffset(0)> Dim s As Short<FieldOffset(2)> Dim us As UShort<FieldOffset(0)> Dim i As Integer<FieldOffset(0)> Dim ui As UIntegerEnd Structure

可以看出 .NET 中的联合体更强大,因为它甚至可以指定某个数值的偏移位置。

一个完整的程序示例

Imports System.Runtime.InteropServices '引入运行时非托管数据管理服务Public Class Form1<StructLayout(LayoutKind.Explicit)> _Structure MyUnion<FieldOffset(0)> Dim b0 As Byte<FieldOffset(1)> Dim b1 As Byte<FieldOffset(2)> Dim b2 As Byte<FieldOffset(3)> Dim b3 As Byte<FieldOffset(0)> Dim s As Short<FieldOffset(2)> Dim us As UShort<FieldOffset(0)> Dim i As Integer<FieldOffset(0)> Dim ui As UInteger<FieldOffset(0)> Dim fd As SingleEnd StructureStructure MyStructDim b0 As ByteDim b1 As ByteDim b2 As ByteDim b3 As ByteDim s As ShortDim us As UShortDim i As IntegerDim ui As UIntegerEnd StructurePrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.ClickDim mu As MyUnion' 一种安全的int与uint转换方法'mu.ui = UInteger.MaxValuemu.i = &H8234567Fmu.ui = &H7234567FMsgBox(mu.i) ' 一个存储与读取IP数据的方法mu.b0 = 128 : mu.b1 = 0 : mu.b2 = 0 : mu.b3 = 1 '127.0.0.1Dim ip As New Net.IPAddress({128, 0, 0, 1})MsgBox(CInt(ip.GetHashCode) = mu.i) 'ip数值相等' 其他用法...mu.ui = UInteger.MaxValueMsgBox(mu.s) '-1MsgBox(mu.us) '65535End SubEnd Class

下位机和上位机浮点传输示例

如果下位机和上位机是通过串口传输

下位机示例

union DoubleToBit
{unsigned char  char_buffer[8];double   double_num;
};union FloatToBit
{unsigned char  char_buffer[4];float   float_num;
};void transFloat(float f_ptr)
{int i;unsigned char data;Float_char_union.float_num = f_ptr;for(i = 0 ; i < 4 ; i++){data = Float_char_union.char_buffer[3-i];write_queue_tx(data);}}void transDouble(double d_ptr)
{int i;unsigned char data;Double_char_union.double_num = d_ptr;for(i = 0 ; i < 8 ; i++){data = Double_char_union.char_buffer[7-i];write_queue_tx(data);}}

上位机示例

Imports System.Runtime.InteropServices '引入运行时非托管数据管理服务Public Class Form1<StructLayout(LayoutKind.Explicit)> _Structure MyUnion<FieldOffset(0)> Dim b0 As Byte<FieldOffset(1)> Dim b1 As Byte<FieldOffset(2)> Dim b2 As Byte<FieldOffset(3)> Dim b3 As Byte<FieldOffset(0)> Dim fd As SingleEnd StructureDim mu As MyUnionmu.b0 = hex1 mu.b1 = hex2  mu.b2 = hex3  mu.b3 = hex4  MsgBox(mu.fd)

VB.net小技巧——VB.net中的结构体和共用体相关推荐

  1. VB.net小技巧——VB中利用TreeView控件和Box控件做知识备忘

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 VB.net小技巧--VB中利用TreeView控件和Box控件做知识备忘 这里不涉及代码的展示,主要是为了阐述一种做笔记的思想. 为 ...

  2. VB.net小技巧——VB.net中SHELL函数以及SendKeys函数

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 VB.net小技巧--VB.net中SHELL函数以及SendKeys函数 前言 shell 使用 前言 一直在研究怎么用VB.net ...

  3. VB小技巧:字符变量中双引号的输入

    '如要输入表示    "aa" '理论表达方式如: a=""aa""  '但会出错 'ASC码可能达到效果 kk=chr(34)   &am ...

  4. VB.net小技巧——读取文本文件并显示到文本框中

    VB.net小技巧--读取文本文件并显示到文本框中 第一步,在工具箱添加OpenFileDialog控件 第二步 openfiledialog 属性 filter设置为: 文本文件(*.txt)|*. ...

  5. VB.net小技巧——使用DataGridView显示EXECL表格内容

    VB.net小技巧--使用DataGridView显示EXECL表格内容 直接上代码 Private Sub Button24_Click(ByVal sender As System.Object, ...

  6. VB.net小技巧——ReoGrid控件添加到工具箱说明

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 VB.net小技巧--ReoGrid控件添加到工具箱说明 Add Control by Programming for Windows ...

  7. 工作小技巧—在word中使用邮件批量插入excel中的数据

    工作小技巧-在word中使用邮件批量插入excel中的数据 word中使用邮件批量插入excel中的数据 1.选择数据源 2.插入数据 3.完成合并 word中使用邮件批量插入excel中的数据 1. ...

  8. 浅谈c++中结构体和共用体的区别

    在c++中,结构体(struct)和共用体(union)是两种很相似的复合数据类型,都可以用来存储多种数据类型,但是两者还有很大的区别. 结构体(struct) 结构是用户自定义的类型,比数组更灵活, ...

  9. VB小技巧 文本框中屏蔽系统右键菜单用自定义菜单代替自带右键菜单

    'txtList是textbox控件,pop2是自定菜单名 Private Sub txtList_MouseDown(Button As Integer, Shift As Integer, X A ...

  10. 论文写作排版小技巧(更新中)

    熟练了语法之后,毕业论文其实用 LaTeX 写是最好的,但总有些原因吧. Word 排版是比较蛋疼的.整格式第一件要做的事情就是找学校的官方模板,把正文往上套. 模板解决不了的以及一些写论文时候发现的 ...

最新文章

  1. Vue 数组中更新属性值后,视图不更新,等待其他元素更新后会触发的解决办法...
  2. 创建ASP.NET WEB自定义控件——例程2
  3. sklearn使用投票回归VotingRegressor算法构建多模型融合的投票回归模型、并自定义子回归器的权重(weights)、评估多模型融合的回归模型、评估R2、mse、rmse、mape
  4. centos6.5安装jira6.3.6详细文档汉化破解
  5. 基于若依框架的二次开发_SAP Commerce(原Hybris)的订单处理框架和SAP CRM One Order框架...
  6. 【Nginx】输出/返回 HelloWorld
  7. apache.commons.lang.StringUtils 使用心得
  8. 合并工具_你值得拥有这个PDF合并工具 免费获取转换方法
  9. android开发隐藏软键盘,Android开发之完全隐藏软键盘的方法
  10. [译]R语言——Shiny框架之入门(三):如何启动一个Shiny应用
  11. c语言static的用法_一文轻松掌握,单片机中C语言的数据存储与程序编写
  12. CenturyLink设定NG-PON2部署阶段 业务、无线回程为初始服务目标
  13. [html5网页设计]英雄联盟lpl总决赛游戏网页设计大作业,hbuilder网页设计成品,dw网页设计成品模板,游戏网页设计带图片轮播,音乐,视频,注册登录表单。
  14. 搜索引擎(二)网页排名算法(1)PageRank
  15. 【Mysql 第11章_数据处理之增删改】
  16. 基于RTS超低延时直播优化强互动场景体验
  17. TCP状态转换图文解说
  18. 『毒舌吐槽社区』-很多敏感内容,你懂的!
  19. 土地覆盖/土地利用简介及数据集
  20. 游戏c是什么网络语言,游戏cpdd网络用语是什么意思 王者荣耀里很常见

热门文章

  1. gitbub.com设置协作者提交代码步骤
  2. 【vue】浏览器播放提示音audio
  3. python selenium清除浏览器缓存
  4. 关于Windows Server 2008 Service Pack 1
  5. 《SpringBoot 手册》:国际化组件 MessageSource
  6. 外卖返利小程序饿了么美团对接公众号返利系统分销系统源码
  7. 百度排名批量查询_企业网站建设,核心关键词排名丢失,怎么办?
  8. jQuery封装的获取Url中的Get参数
  9. 凤凰系统安装到移动硬盘教程
  10. 网络广告创意的特点及产生的方法