gpt4 book ai didi

c# - 无需序列化或填充即可将对象转换为字节数组

转载 作者:太空宇宙 更新时间:2023-11-03 14:58:24 24 4
gpt4 key购买 nike

这看起来很容易,但我一点也不觉得容易。我的问题是我有一个结构,我需要将它转换为字节流,而不需要任何额外的类型字节、填充字节或元数据。假设我有一个结构

[StructLayout(LayoutKind.Sequential)]
public struct MyStruct
{
public ushort a;
public uint b;
public uint c;
public ushort d;
}

备注:我无法将此处的 pack 更改为 1(Project constrains),因此使用以下解决方案不会起作用,因为添加了填充 p>

int size = Marshal.SizeOf(typeof(T));
byte[] arr = new byte[size];
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(str, ptr, true);
Marshal.Copy(ptr, arr, 0, size);
Marshal.FreeHGlobal(ptr);

另请注意:我不能使用二进制格式序列化,因为添加了元数据。我想要的只是 if a=1 b=2 c=3 d=4 以 GENERIC WAY 获取二进制格式作为

    arr {byte[12]}  byte[]
[0] 1 byte
[1] 0 byte
[2] 2 byte
[3] 0 byte
[4] 0 byte
[5] 0 byte
[6] 3 byte
[7] 0 byte
[8] 0 byte
[9] 0 byte
[10] 4 byte
[11] 0 byte

有什么帮助吗?

最佳答案

如果您不介意一些手动工作,您可以编写自己的转换器并以不同方式处理每种数据类型,例如:

public static class StructSerializer
{
public static byte[] Serialize<T>(T data) where T : struct
{
List<byte> result = new List<byte>();
Type type = data.GetType();
IEnumerable<FieldInfo> orderedFields = type.GetFields().OrderBy(f => Marshal.OffsetOf(type, f.Name).ToInt32());

foreach (FieldInfo fieldInfo in orderedFields)
{
object value = fieldInfo.GetValue(data);
MethodInfo conversion = typeof(BitConverter).GetMethod(nameof(BitConverter.GetBytes), new[]{fieldInfo.FieldType});
if (conversion == null) continue;
byte[] converted = (byte[])conversion.Invoke(null, new []{value});
result.AddRange(converted);
}

return result.ToArray();
}
}

您没有特别提到它,但请记住 ByteOrder。您可以使用 BitConverter.IsLittleEndian 检查字节顺序。

关于c# - 无需序列化或填充即可将对象转换为字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47649798/

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