gpt4 book ai didi

c# - 为什么我返回的对象与我收到的对象不匹配?

转载 作者:行者123 更新时间:2023-11-30 20:21:43 24 4
gpt4 key购买 nike

我正在尝试将字节数组反序列化为结构。

这是我的反序列化函数:

void RawDeserialize(byte[] bytearray, object obj)
{
int len = Marshal.SizeOf(obj);

IntPtr i = Marshal.AllocHGlobal(len);

Marshal.Copy(bytearray, 0, i, len);

obj = Marshal.PtrToStructure(i, obj.GetType());

Marshal.FreeHGlobal(i);
}

我称之为

RawDeserialize(outarr, outbuf);

其中 outarr 是一个长度为 22 的字节数组,outbuf 是我的结构,如下所示:

[StructLayout(LayoutKind.Sequential,Size =22)]
public struct ID_OUTPUT
{
public HEADER_OUTPUT hdr; //Another struct size=8
public byte bType;
public byte bRunning;
[MarshalAs(UnmanagedType.ByValTStr,SizeConst = 8)]
public string softwareName;
public short softwareVersion;
}

当我在我的反序列化函数中逐步调试时,obj 填充了正确的值,但在返回时 outbuf 填充了零(或者从未分配给因为我最初将所有内容初始化为零)。

我最初的想法是对象没有通过引用传递,但我认为这应该有效,因为我在另一个 SO 问题上发现了这个反序列化函数(我不再有链接)。

然后我尝试使用 ref 关键字,但随后出现错误无法从 ref ID_OUTPUT 转换为 ref 对象

最佳答案

当您处理多种结构类型并需要一种独特的方法来完成这项工作时,generics是一个不错的选择。这使您可以使用良好的 C# 语法,而无需将您的实例转换为 object

// For .Net 4.5 and previous versions
public static T RawDeserialize<T>(byte[] bytearray)
where T : struct
{
var type = typeof(T);
int len = Marshal.SizeOf(type);

IntPtr i = IntPtr.Zero;
try
{
i = Marshal.AllocHGlobal(len);

Marshal.Copy(bytearray, 0, i, len);

return (T)Marshal.PtrToStructure(i, type);
}
finally
{
if (i != IntPtr.Zero)
{
Marshal.FreeHGlobal(i);
}
}
}

用法:

ID_OUTPUT myStruct = RawDeserialize<ID_OUTPUT>(someByteArray);
ZZZZ myStruct2 = RawDeserialize<ZZZZ>(someByteArray);

对于 .Net 4.5.1+,您可能需要使用 SizeOf/PtrToStructure 的通用版本:

public static T RawDeserialize<T>(byte[] bytearray)
where T : struct
{
int len = Marshal.SizeOf<T>();

IntPtr i = IntPtr.Zero;
try
{
i = Marshal.AllocHGlobal(len);

Marshal.Copy(bytearray, 0, i, len);

return Marshal.PtrToStructure<T>(i);
}
finally
{
if (i != IntPtr.Zero)
{
Marshal.FreeHGlobal(i);
}
}
}

关于c# - 为什么我返回的对象与我收到的对象不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33348113/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com