c# - 如何在 c# 中将 void* 转换为特定类型?
问题描述
我有一系列类,每个类都是为特定类型构建的(Byte
、UInt16
、Double
等;每个类都由 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);
}
这显然是行不通的。我一直在尝试阅读有关使用的信息Func
,delegates
但一直遇到无法像我想要的那样转换 void* 的墙。
因为我认为它增加了上下文。这是试图在给定位置获取值。我有一个镜像方法应该有:
*((MyType*) _baseAddress + (_table + x)->XEntry ) = inputValue;
注意:性能很重要。我无法分配新内存,也无法在转换中消耗大量处理器时间
解决方案
如果我正确理解您的问题,这将完成您想要的:
/// <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;
}
Marshal
在System.Runtime.InteropServices
.
如果您需要绝对最快的速度,请查看此处。
您还应该查看BitConverter类。
推荐阅读
- c# - 在 Windows 窗体中嵌入 DLL(系统找不到指定的文件。)
- angular - Angular 材质中的日期选择器(Angular 5)
- amazon-ec2 - 我在亚马逊 EC2 上托管了我的代码并且没有指向域。即使在测试帐户中,我的支付网关似乎也无法正常工作
- python - 如何存储 spacy doc 对象并正确重新加载它们?
- python - 将日期时间转换为 PST 时区
- scala - 第一次调用时播放框架很慢
- tensorflow - TensorFlow - Session() 和 Session(Graph()) 之间的差异
- php - 在 PDF 中搜索字符串并获取它们在页面上的位置
- javascript - npm 和 yarn:package.json 是否优先于 lockfile?
- python - 计算列表列中两个元素的出现次数