c# 如何 使用共用体
用起来真的方便 转摘如下:
C#借助FieldOffset属性实现共用体与强制类型转换
这两天被C#的强制类型转换弄得有点不习惯。事出如此。
在C#中,我打算读二进制文。文件的结构很简单,一连串的紧密存储的int32值,以二进制方式存放。现在我希望随机读取第n个int32开始的i个值,并读入到数组中。结果查一下C#只能读到byte[]中,要不就是一个个读出来循环放int[]。追求效率的我当然不希望这样,如果能像C++那样将byte[]强制转换成int[]就好了。例如:
- char tmp[64]; // 16个int。相当于C#的 byte[] tmp = new int[64];
- int* dat; // dat的指针。相当于C#的 int[] dat;
- ifstream IF(...); // 标准文件输入流。相当于C#的 FileStream FS = new FileStream(...);
- IF.read(tmp, 64); // 读取64个字节。 相当于C#的 FS.Read(tmp,0,64);
- dat = (int*)tmp; // 将tmp数组的首地址转为int类型,则数组以4个字节为一个int转换为int型的数组。
- // 数据在内存上没有任何变化,因为数据本来就是int型的。
- // 关键是这一步在C#中无法直接实现。
- for (int i = 0; i < 16; i++)
- cout << dat[i] << " "; // 输出数据。相当于C#的 Console.Write(dat[i]+" ");
在C#中无法直接实现,为此我想了好些办法,也查了好久,直到我见到了这样的代码:
- using System;
- using System.IO;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- // 提供各种各样支持 COM 互操作 及平台调用服务的成员
- using System.Runtime.InteropServices;
- namespace test
- {
- class Program
- {
- // StructLayout使设计者可以控制类或结构的数据字段的物理布局
- // Explicit与FieldOffset一起可以控制每个数据成员的精确位置
- [StructLayout(LayoutKind.Explicit)]
- public struct S1
- {
- // FieldOffset控制字段所在的物理位置偏移为0
- [FieldOffset(0)]
- public byte[] a;
- // 同样偏移为0,开始位置与a重叠了。
- [FieldOffset(0)]
- public int[] b;
- }
- static void Main(string[] args)
- {
- S1 s = new S1(); // 要new,不然b会报“使用了可能未赋值的字段”
- s.a=new byte[64];
- FileStream FS = new FileStream("E:\\test.txt", FileMode.Open);
- // 以s.a来接收文件的数据
- FS.Read(s.a,0,64);
- // 自己保证读b的时候不要越界
- for (int i = 0; i < 16; i++)
- Console.Write(s.b[i]+" "); // 以b来使用数据
- Console.ReadKey();
- }
- }
- }
原理实际上跟C++一样,将一个int[]型的变量指向与byte[]型变量相同的内存区域,跟C++中将dat指向char数组的首地址是一样的。同样,这样的结构体功能与C++的共用体是一样的,即一个结构可以作为多种数据类型,而具体是什么类型视情况而定。
测试所使用的文件就不上传了,有WinHex的可以自己编辑一个,没有的也可以写程序将从0xF到0x0的16个数以二进制方式输出到文件中。文件的内容用WinHex打开以16进制显示应该如下:
c# 如何 使用共用体的更多相关文章
- C语言共用体、大小端、枚举
1.共用体和结构体的相同和不同 (1)相同点就是操作语法几乎相同.(2)不同点是本质上的不同.struct是多个独立元素(内存空间)打包在一起:union是一个元素(内存空间)的多种不同解析方式. # ...
- C语言共用体(Union)
通过前面的讲解,我们知道结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员.在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为: uni ...
- 瘋子C语言笔记(结构体/共用体/枚举篇)
(一)结构体类型 1.简介: 例: struct date { int month; int day; int year; }; struct student { int num; char name ...
- C++结构、共用体、枚举
一.结构 结构是C++OOP的基石.学习有关结构的知识僵尸我们离C++的核心OOP更近. 结构是用户定义的类型,同一个结构可以存储多种类型数据,这使得将一个事物的不同属性构成一个对象成为了可能.另外C ...
- 【C语言入门教程】7.4 共用体
7.4 共用体 共用体又称为联合体,是由不同的数据类型组成的一个整体.与结构体不同的是,共用体每次只能使用其中一个成员.结构体的总长度是结构体所有成员长度之和,共用体的总长度是其中最长一个数据类型的长 ...
- C语言之共用体
最近在复习C语言,特再次记录: 有时需要将几种不同类型的变量存放到同一段内存单元中.如一个int.float.char放在同一个地址开始的内存单元中.,也就是使用覆盖技术,几个变量相互覆盖,称之为共用 ...
- 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符
[源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...
- C语言-10-位域与共用体
位域 在某种特定情况下,一个结构体中的多个变量只使用各自存储空间的几位,而其他位从来不使用.这种情况下,可以使用位域来限定每个变量的用来存储数据的位宽. 作用 限定结构体中变量用来存放数据的位宽,即使 ...
- C语言 共用体
//共用体 union #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #includ ...
- 转:union 联合体(共用体)
转自:http://blog.csdn.net/xiao3404/article/details/22276485 2.共用体 2.1共用体的概念 共用体是一种构造类型的数据结构.在一个“共用体”内可 ...
随机推荐
- Bugku-CTF之网站被黑(这个题没技术含量但是实战中经常遇到)
Day11 网站被黑 http://123.206.87.240:8002/webshell/
- flask --- 02. 路由, 初始化配置,蓝图
一.Flask 路由 1.添加路由的方式 ① ② 实例: ① @app.route("/my_de") def detail() ② def detail() app.add_ur ...
- tp剩余未验证内容-7
bash脚本中 的 set -e表示 exit immediately if a simple command returns a non-zero value.主要是为了防止错误被忽略.会被立即退出 ...
- Microsoft Visual Studio已停止工作
问题:今天在安装Visual Studio时,提示“Visual Studio installer 已停止工作” 解决办法:卸载原有的 .net framework,在微软官网下载 .net fra ...
- 51Nod - 1384
全排列函数解法 #include <iostream> #include <cstdio> #include <cstring> #include <cmat ...
- 清理SuperMap三维缓存
一.iclient三维插件浏览器端缓存 方法1:遍历users子文件夹,发现指定目录有supermap,即删除 @echo offtitle 清理三维缓存@echo 开始清理三维缓存...for /f ...
- 版本控制 version control
而版本控制能记录所有的操作,如创建删除增加,并能返回到之前的版本.版本控制通常需要同一些远程仓库配合使用,如GitHub 廖雪峰教学有 https://www.liaoxuefeng.com/wiki ...
- Kafka学习之二 Kafka安装和使用
部署环境Linux(Centos 6.5),JDK 1.8.0,zookeeper-3.4.12,kafka_2.11-2.0.0. 1. 单机环境 官方建议使用JDK 1.8版本,因此本文使 ...
- Go 安装 sqlite3驱动报错
问题:最近在使用Go做一个博客示例,在使用go get 安装 sqlIite3的驱动遇到下面的问题(cc1.exe: sorry, unimplemented: 64-bit mode not com ...
- openstack详细笔记-nova-glance-swift-cinder-keystone等
一.openstack各大模块 1.openstack总架构图 http://3ms.huawei.com/km/blogs/details/2655265 2.nova 2.0架构图 2.1 nov ...