【发布时间】:2010-12-28 11:54:08
【问题描述】:
谁能告诉我如何在 C# .NET 版本 2 中以直接方式将字节数组放入结构中?就像 C 中熟悉的 fread 一样,到目前为止,我在读取字节流和自动填充结构方面还没有取得太大成功。我已经看到了一些使用 unsafe 关键字在托管代码中有指针 hocus-pocus 的实现。
看看这个示例:
public unsafe struct foobarStruct{
/* fields here... */
public foobarStruct(int nFakeArgs){
/* Initialize the fields... */
}
public foobarStruct(byte[] data) : this(0) {
unsafe {
GCHandle hByteData = GCHandle.Alloc(data, GCHandleType.Pinned);
IntPtr pByteData = hByteData.AddrOfPinnedObject();
this = (foobarStruct)Marshal.PtrToStructure(pByteData, this.GetType());
hByteData.Free();
}
}
}
foobarStruct 中有两个构造函数的原因
- 是否不能有空的构造函数。
- 在实例化结构时将一块内存(作为字节数组)传入构造函数。
该实现是否足够好,或者是否有更简洁的方法来实现这一目标?
编辑:我不想使用 ISerializable 接口或其实现。 我正在尝试读取二进制图像以计算出使用的字段并使用 PE 结构确定其数据。
【问题讨论】:
-
即使在 C 中,由于填充和对齐方面的考虑,直接将
fread转换为struct也是一个非常糟糕的主意 -
您是否考虑过在这里使用序列化?
-
这个操作必须发生在一个不安全的块中,因为它是不安全的。结构可以包含指向引用类型等的成员。您要求获取磁盘的未知字节并将它们扔到可能包含指向任何内容的指针的结构中。要求框架验证您正在尝试做的事情太多了,因此是不安全的块。你仍然可以这样做,但框架必须采取“你自己”的方法。序列化为您处理潜在的问题,但它并不适合所有场景。我认为您不会比显示的代码做得更好。
-
感谢大家的意见!有一个快乐的季节问候/圣诞节:)