如何在C#中将void *转换为特定类型?

时间:2018-12-21 19:55:48

标签: c# pointers .net-core void-pointers

我有一系列的类,每个类都针对特定的类型(SELECT * from account WHERE accountId = (SELECT payersAccountId FROM transaction WHERE sessionId = 1)ByteUInt16等;每个类都由Double定义)。每个类都有几乎相同的代码,但会对其特定类型进行一些强制转换。 注意:有一个类成员定义为: TypeCodevoid* _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); } Func的用法,但一直碰到一堵墙,无法按照我的意愿转换void *。

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

delegates

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

1 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,这将满足您的要求:

    /// <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中。

如果需要绝对最快的速度,请查看here

您还应该查看BitConverter类。