在C#中初始化一个byte *的集合

时间:2010-08-24 20:16:34

标签: c# unsafe

我的不安全方法接受集合byte[]。所有这些byte[]都具有相同的大小。

我需要迭代它们,搜索某些模式。搜索本质上是重新解释的样式:在每个偏移处,我需要考虑一个值,就好像它是一个浮点数,一个double,一个short,一个int等等。所以为每个输入byte* byte[] 1}}并在每次迭代时递增它似乎是一种自然的方法。

不幸的是,我找不到任何方法来创建byte*的集合 - 或者更具体地说,是从一组数组中初始化它。有什么想法吗?

这是一个有点人为的任务版本:

static unsafe void SearchIteration(List<byte[]> arrays, byte[] resultArr)
{
    fixed (byte* resultFix = resultArr)
    {
        byte* resultPtr = resultFix;
        byte*[] pointers = new byte*[arrays.Count];

        <some code to fix all the arrays and store the pointers in "pointers">

        int remaining = resultArr.Length;
        while (remaining > 0)
        {
            <look at resultPtr and each of the pointers and update *resultPtr>

            remaining--;
            for (int i = 0; i < pointers.Length; i++)
                pointers[i]++;
        }
    }
}

基本上问题是如何使用pointers的地址初始化arrays,同时固定数组以便GC不会移动它们。

1 个答案:

答案 0 :(得分:2)

使用GCHandle.Alloc()中的System.Runtime.InteropServices

var handles = new GCHandle[arrays.Count];
byte*[] pointers = new byte*[arrays.Count];
for(int i = 0; i < arrays.Count; ++i)
{
    handles[i] = GCHandle.Alloc(arrays[i], GCHandleType.Pinned);
    pointers[i] = (byte*)handles[i].AddrOfPinnedObject();
}
try
{
    /* process pointers */
}
finally
{
    for(int i = 0; i < arrays.Count; ++i)
    {
        handles[i].Free();
    }
}