用起来真的便利 转摘如下:
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)
{