例如: [cpp] chartmp[64]; //16个int

时间:2022-03-15 08:47:08

用起来真的便利 转摘如下:

C#借助FieldOffset属性实现共用体与强制类型转换

这两天被C#的强制类型转换弄得有点不习惯。事出如此。

在C#中,我筹算读二进制文。文件的布局很简单,一连串的紧密存储的int32值,以二进制方法存放。此刻我但愿随机读取第n个int32开始的i个值,并读入到数组中。功效查一下C#只能读到byte[]中,要不就是一个个读出来循环放int[]。追求效率的我固然不但愿这样,如果能像C++那样将byte[]强制转换成int[]就好了。例如:

[cpp]  

 

 

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#中无法直接实现,为此我想了好些步伐,也查了好久,直到我见到了这样的代码:

[csharp]  

 

 

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)  

        {