繁体   English   中英

C#字节数组到固定的int指针

[英]C# byte array to fixed int pointer

是否有可能以某种方式转换fixed()语句创建的指针的类型?

情况就是这样:

我有一个字节数组,我想迭代,但我希望将值视为int,因此有一个int *而不是一个字节*。

这是一些示例代码:

byte[] rawdata = new byte[1024];

fixed(int* ptr = rawdata) //this fails with an implicit cast error
{
    for(int i = idx; i < rawdata.Length; i++)
    {
        //do some work here
    }
}

这可以在不必在迭代内进行转换的情况下完成吗?

我相信你必须经过一个byte* 例如:

using System;

class Test
{
    unsafe static void Main()
    {
        byte[] rawData = new byte[1024];
        rawData[0] = 1;
        rawData[1] = 2;

        fixed (byte* bytePtr = rawData)
        {
            int* intPtr = (int*) bytePtr;
            Console.WriteLine(intPtr[0]); // Prints 513 on my box
        }
    }
}

请注意,在迭代时,如果将字节数组视为32位值序列,则应使用rawData.Length / 4 ,而不是rawData.Length

byte[] rawdata = new byte[1024];

fixed(byte* bptr = rawdata)
{
    int* ptr=(int*)bptr;
    for(int i = idx; i < rawdata.Length; i++)
    {
        //do some work here
    }
}

我发现 - 似乎 - 更优雅,并且由于某种原因也更快地做到这一点:

        byte[] rawData = new byte[1024];
        GCHandle rawDataHandle = GCHandle.Alloc(rawData, GCHandleType.Pinned);
        int* iPtr = (int*)rawDataHandle.AddrOfPinnedObject().ToPointer();
        int length = rawData.Length / sizeof (int);

        for (int idx = 0; idx < length; idx++, iPtr++)
        {
            (*iPtr) = idx;
            Console.WriteLine("Value of integer at pointer position: {0}", (*iPtr));
        }
        rawDataHandle.Free();

这样我唯一需要做的 - 除了设置正确的迭代长度 - 增加指针。 我将代码与使用fixed语句的代码进行了比较,而且这个代码稍快一些。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM