【发布时间】:2012-05-16 10:15:35
【问题描述】:
我打算建模一个 C# 类来解析我作为原始缓冲区接收到的自定义协议数据。缓冲区已经作为字节数组存在。
这个解析器必须处理不同的字段布局,因此一些协议元素是 IntPtrs。
当我在将原始缓冲区映射到结构后尝试访问结构内的指针时,遇到了访问冲突。
我做了一个简单的例子来展示关键部分:
namespace CS_StructMarshalling
{
class Packet
{
public PacketStruct Fields;
[StructLayout(LayoutKind.Explicit)]
public struct PacketStruct
{
[FieldOffset(0)] public UInt16 Flags;
[FieldOffset(2)] public IntPtr Data;
}
public Packet()
{
Fields = new PacketStruct();
}
public void DecompileBinaryBuffer(ref Byte[] byteBuffer)
{
int size = Marshal.SizeOf(typeof(PacketStruct));
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(byteBuffer, 0, ptr, size);
this.Fields = (PacketStruct)Marshal.PtrToStructure(ptr, typeof(PacketStruct));
Marshal.FreeHGlobal(ptr);
}
}
class Program
{
static void Main(string[] args)
{
byte[] rawBuffer = new byte[] { 1, 2, 65, 66, 67, 68, 69, 70 };
Packet testPkt = new Packet();
testPkt.DecompileBinaryBuffer(ref rawBuffer);
UInt16 testFlags = testPkt.Fields.Flags;
String testData = Marshal.PtrToStringAnsi(testPkt.Fields.Data, 6);
}
}
}
我只是试图解决这个问题,但无济于事。据我了解,IntPtr 必须单独编组,但我没有找到任何提示如何以干净的方式完成此操作。
欢迎任何指点。感谢您的宝贵时间。
【问题讨论】:
-
发送
IntPtr是注定的; 永远无法工作。然而;看起来你只是想序列化一些数据;您是否考虑过诸如 protobuf-net 之类的预滚动二进制序列化 API?
标签: c# struct marshalling intptr