gpt4 book ai didi

c# - 如何将 byte[] 转换为 struct(包含一个 byte[] 成员和 length 成员)

转载 作者:太空宇宙 更新时间:2023-11-03 12:08:11 26 4
gpt4 key购买 nike

我有一个结构定义为:

[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Ansi,Pack = 1)]
internal struct Message
{
[MarshalAs(UnmanagedType.U1, SizeConst = 1)]
public byte age;
[MarshalAs(UnmanagedType.U2, SizeConst = 2)]
public ushort length;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1,SizeConst = 502)]
public byte[] data;
}

通过udp接收到的payload,当接收到byte[]时,需要转换成struct。data长度指定为502,但实际上应该是length成员值表示数据长度,如果去掉SizeConst attr,代码将在 Marshal.SizeOf(typeof(T)) 处抛出 Marshal 异常。

public static T ToStruct<T>(this byte[] buf)
{
var lth = Marshal.SizeOf(typeof(T));
if (lth > buf.Length) return default(T);
var ptr = Marshal.AllocHGlobal(lth);
Marshal.Copy(buf, 0, ptr, lth);
var structure = Marshal.PtrToStructure(ptr, typeof(T));
Marshal.FreeHGlobal(ptr);
return (T)structure;
}

异常信息:

System.ArgumentException: Type 'Itms.Agent.IotBox.TieTa.Entity.Message' cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed.

我知道这在 c/c++ 中处理起来非常简单,但 C# 没有类似的方法。有帮助吗?

最佳答案

when received byte[],need to be converted to struct. data length specified as 502,but actually it should be the length member value indicating the data length

这对于简单的编码操作来说太复杂了。您可能需要手动序列化/反序列化,例如:

byte[] payload = ...
var age = payload[0];
var len = (payload[1] << 8) | payload[2]; // invert depending on endianness
byte[] data = len == 0 ? Array.Empty<byte>() : new byte[len];
Buffer.BlockCopy(payload, 3, data, len);
var msg = new Message(age, len, data);

这意味着您可以删除所有属性,因为您没有使用任何编码功能。另外... length 字段似乎有点多余,因为它只是复制数组的长度。

关于c# - 如何将 byte[] 转换为 struct(包含一个 byte[] 成员和 length 成员),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53833326/

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