我打算建模一个 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 必须单独编组,但我没有找到任何提示如何以干净的方式完成此操作。
欢迎任何指点。感谢您的时间。