English 中文(简体)
在C#中读取结构体数组
原标题:
  • 时间:2009-02-11 08:00:19
  •  标签:

我在这里看到了这里,也通过谷歌搜索了几种方法来将字节数组转换为结构体。

但是我所寻找的是是否有一种方法可以一次性从文件(好吧,无论是什么内存输入)读取结构数组?

我的意思是,从文件加载一个结构体数组通常需要更多的CPU时间(使用BinaryReader每个字段进行一次读取),而不是IO时间。有什么解决方法吗?

我正在尝试尽可能快地从文件中加载约400K个结构体。

Thanks

帕布罗

问题回答

以下网址可能会引起您的兴趣。

将此翻译为中文:http://www.codeproject.com/KB/files/fastbinaryfileinput.aspx http://www.codeproject.com/KB/files/fastbinaryfileinput.aspx

否则,我认为可以像下面这样编写伪代码:

一次性读取二进制数据并转换回结构体。

public struct YourStruct
{ 
    public int First;
    public long Second;
    public double Third;
}

static unsafe byte[] YourStructToBytes( YourStruct s[], int arrayLen )
{
    byte[] arr = new byte[ sizeof(YourStruct) * arrayLen ];
    fixed( byte* parr = arr )
    { 
        * ( (YourStruct * )parr) = s; 
    }
    return arr;
}

static unsafe YourStruct[] BytesToYourStruct( byte[] arr, int arrayLen )
{
    if( arr.Length < (sizeof(YourStruct)*arrayLen) )
        throw new ArgumentException();
    YourStruct s[];
    fixed( byte* parr = arr )
    { 
        s = * ((YourStruct * )parr); 
    }
    return s;
}

现在,您可以一次性从文件中读取字节数组,并使用BytesToYourStruct将其转换回结构。

希望您能执行这一想法并进行检查...

I found a potential solution at this site - http://www.eggheadcafe.com/software/aspnet/32846931/writingreading-an-array.aspx

它基本上说要使用二进制格式化程序,如下所示:

FileStream fs = new FileStream("DataFile.dat", FileMode.Create); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(fs, somestruct);

I also found two questions from this site - Reading a C/C++ data structure in C# from a byte array and How to marshal an array of structs - (.Net/C# => C++)

我以前从没做过这个,我自己也是一个C# .NET的初学者。我希望这个解决方案能有所帮助。





相关问题
热门标签