背景:
1.结构体很多,用BitCovert手动转的话,可能会死人。
2.是用于Socket通信,服务器端是C++已经写好,不能改,也就是说序列化不能用。
3.unsafe 的话同样面临第一点的问题.
4.由于平台原因,不能使用Marshal.能否有好一点的解决方案?
thank you.
1.结构体很多,用BitCovert手动转的话,可能会死人。
2.是用于Socket通信,服务器端是C++已经写好,不能改,也就是说序列化不能用。
3.unsafe 的话同样面临第一点的问题.
4.由于平台原因,不能使用Marshal.能否有好一点的解决方案?
thank you.
或者你用c++写个一个dll,里面传入ref 结构体,然后在 dll中对结构体字段赋值,然后返回给你
[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Ansi)] //,Size=16 public struct TestStruct { [MarshalAs(UnmanagedType.R8)] //,FieldOffset(0)] public double dTest; [MarshalAs(UnmanagedType.U2)] //, FieldOffset(8)] public UInt16 uTest; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] //, FieldOffset(10)] public byte[] bTest; } //序列化 public static byte[] rawSerialize(object obj) { int rawsize = Marshal.SizeOf(obj); IntPtr buffer = Marshal.AllocHGlobal(rawsize); Marshal.StructureToPtr(obj, buffer, false); byte[] rawdatas = new byte[rawsize]; Marshal.Copy(buffer, rawdatas, 0, rawsize); Marshal.FreeHGlobal(buffer); return rawdatas; } //反序列化 public static TestStruct rawDeserialize(byte[] rawdatas) { Type anytype = typeof(TestStruct); int rawsize = Marshal.SizeOf(anytype); if (rawsize > rawdatas.Length) return new TestStruct(); IntPtr buffer = Marshal.AllocHGlobal(rawsize); Marshal.Copy(rawdatas, 0, buffer, rawsize); object retobj = Marshal.PtrToStructure(buffer, anytype); Marshal.FreeHGlobal(buffer); return (TestStruct)retobj; } }
哥,你是大哥,都说了IOS平台不支持 Marshal。
不用呀,写一个函数,俩参数,一个结构体,一个结构体长度,然后byte[i]=*((byte*)(&结构体)+i),一个一个读呗
S2B<T>(int size,T obj); //明显不对
S2Bint size,object obj);//调用的时候强转类型会出错
这样试试:
unsafe byte[] S2B(int size, byte* obj)
{
byte[] b = new byte[size];
for (int i = 0; i < b.Length; i++)
{
b[i] = *(obj + i);
}
return b;
}
额,我发现我的类无法用指针。
报错:
无法取得托管类型的地址和大小,或无法说明指向他的指针。类大概结构
Class A
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = CONST.MAX_PLAYER_ENAME_LEN)]
public char[] szPlayerName;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = CONST.MAX_PLAYER_PWD_LEN)]
public char[] szPlayerPwd;
public ulong u64Mac;
}
使用:
unsafe
{
A *a;//报错?
}
哦,我试试。
那还有,有没有什么方法能遍历class的成员,有的话,我就可以逐个的用BitCovert了。
struct 不能继承?
各种问题太多了吧?