首页 > 解决方案 > 如何在 c# 中将 void* 转换为特定类型?

问题描述

我有一系列类,每个类都是为特定类型构建的(ByteUInt16Double等;每个类都由 a 定义TypeCode)。每个类都有几乎相同的代码,但会对其特定类型进行一些强制转换。注意:有一个类成员定义为: void* _baseAddress;ClassX* _table;

一个简化的示例方法:

    public unsafe UInt16 GetValue(int x)
    {
        return *((UInt16*) _baseAddress + (_table+ x)->entry);
    }

我想,假设我有一个MyType由 定义的类成员typeof(inputType),来做到这一点:

    public unsafe object GetValue(int x)
    {
        return *((MyType*) _baseAddress + (_table+ x)->entry);
    }

这显然是行不通的。我一直在尝试阅读有关使用的信息Funcdelegates但一直遇到无法像我想要的那样转换 void* 的墙。

因为我认为它增加了上下文。这是试图在给定位置获取值。我有一个镜像方法应该有:

*((MyType*) _baseAddress + (_table + x)->XEntry ) = inputValue;

注意:性能很重要。我无法分配新内存,也无法在转换中消耗大量处理器时间

标签: c#pointers.net-corevoid-pointers

解决方案


如果我正确理解您的问题,这将完成您想要的:

    /// <summary>
    /// Maps the supplied byte array onto a structure of the specified type.
    /// </summary>
    public static T ToStructure<T>(byte[] data)
    {
        unsafe
        {
            fixed (byte* p = &data[0])
            {
                return (T)Marshal.PtrToStructure(new IntPtr(p), typeof(T));
            }
        };
    }

这说明了原理。您应该能够使其适应您的特定目的。

此函数执行相反的操作:

    /// <summary>
    /// Converts the supplied object to a byte array.
    /// </summary>
    public static byte[] ToByteArray(object obj)
    {
        int len = Marshal.SizeOf(obj);
        byte[] arr = new byte[len];
        IntPtr ptr = Marshal.AllocHGlobal(len);
        Marshal.StructureToPtr(obj, ptr, true);
        Marshal.Copy(ptr, arr, 0, len);
        Marshal.FreeHGlobal(ptr);
        return arr;
    }

MarshalSystem.Runtime.InteropServices.

如果您需要绝对最快的速度,请查看此处

您还应该查看BitConverter类。


推荐阅读