用起来真的方便 转摘如下:
C#借助FieldOffset属性实现共用体与强制类型转换
这两天被C#的强制类型转换弄得有点不习惯。事出如此。
在C#中,我打算读二进制文。文件的结构很简单,一连串的紧密存储的int32值,以二进制方式存放。现在我希望随机读取第n个int32开始的i个值,并读入到数组中。结果查一下C#只能读到byte[]中,要不就是一个个读出来循环放int[]。追求效率的我当然不希望这样,如果能像C++那样将byte[]强制转换成int[]就好了。例如:
- char tmp[64];
- int* dat;
- ifstream IF(...);
- IF.read(tmp, 64);
- dat = (int*)tmp;
-
-
- for (int i = 0; i < 16; i++)
- cout << dat[i] << " ";
在C#中无法直接实现,为此我想了好些办法,也查了好久,直到我见到了这样的代码:
- using System;
- using System.IO;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Runtime.InteropServices;
-
- namespace test
- {
- class Program
- {
-
-
- [StructLayout(LayoutKind.Explicit)]
- public struct S1
- {
-
- [FieldOffset(0)]
- public byte[] a;
-
- [FieldOffset(0)]
- public int[] b;
- }
-
- static void Main(string[] args)
- {
- S1 s = new S1();
- s.a=new byte[64];
-
- FileStream FS = new FileStream("E:\\test.txt", FileMode.Open);
-
- FS.Read(s.a,0,64);
-
-
- for (int i = 0; i < 16; i++)
- Console.Write(s.b[i]+" ");
-
- Console.ReadKey();
- }
- }
- }
原理实际上跟C++一样,将一个int[]型的变量指向与byte[]型变量相同的内存区域,跟C++中将dat指向char数组的首地址是一样的。同样,这样的结构体功能与C++的共用体是一样的,即一个结构可以作为多种数据类型,而具体是什么类型视情况而定。
测试所使用的文件就不上传了,有WinHex的可以自己编辑一个,没有的也可以写程序将从0xF到0x0的16个数以二进制方式输出到文件中。文件的内容用WinHex打开以16进制显示应该如下:

c# 如何 使用共用体
原文:http://www.cnblogs.com/wanglg/p/7765896.html