gpt4 book ai didi

c# - Compact Framework 中是否有 StructLayout "Pack"属性的替代方案?

转载 作者:太空狗 更新时间:2023-10-29 21:00:25 29 4
gpt4 key购买 nike

我想做以下事情:

  [StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SomeStruct
{
public byte SomeByte;
public int SomeInt;
public short SomeShort;
public byte SomeByte2;
}

紧凑型框架不支持 Pack,是否有替代方案?

更新:显式设置结构并为每个结构提供 FieldOffset 也不起作用,因为它不影响结构的打包方式

更新 2:如果您尝试以下操作,由于结构的打包方式,CF 程序甚至无法运行:

[StructLayout(LayoutKind.Explicit, Size=8)]
public struct SomeStruct
{
[FieldOffset(0)]
public byte SomeByte;
[FieldOffset(1)]
public int SomeInt;
[FieldOffset(5)]
public short SomeShort;
[FieldOffset(7)]
public byte SomeByte2;
}

我知道这似乎很难相信,但如果您尝试一下就会明白。将它添加到 CF 项目并尝试运行它,您将获得 TypeLoadException。将偏移量分别更改为 0、4、8、10,它将起作用(但大小最终为 12)。

我希望也许有人有一个解决方案,可以使用反射来单独编码每个字段类型的大小(涉及递归以处理结构或类型数组中的结构)。

最佳答案

这可能不是您正在寻找的答案类型,但无论如何我都会发布它:

public struct SomeStruct
{
public byte SomeByte;
public int SomeInt;
public short SomeShort;
public byte SomeByte2;


public byte[] APIStruct
{
get
{
byte[] output = new byte[8];
output[0] = this.SomeByte;
Array.Copy(BitConverter.GetBytes(this.SomeInt), 0,
output, 1, 4);
Array.Copy(BitConverter.GetBytes(this.SomeShort), 0,
output, 5, 2);
output[7] = this.SomeByte2;
return output;
}
set
{
byte[] input = value;
this.SomeByte = input[0];
this.SomeInt = BitConverter.ToInt32(input, 1);
this.SomeShort = BitConverter.ToInt16(input, 5);
this.SomeByte2 = input[7];
}
}
}

基本上,它在 APIStruct 属性中自行打包/解包。

关于c# - Compact Framework 中是否有 StructLayout "Pack"属性的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1127601/

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