C#类变量定义混乱

C#类变量定义混乱,c#,C#,下面是一个c#代码(整个项目太大),使用了一种我以前从未见过的新格式,我不知道如何将FieldOffset放在变量定义之前! 我试图使用此结构将浮点值=55分配给Field2Float,然后我意外地发现 Field2Int也会自动分配值1113325568,这是如何发生的?既然我正在将这段代码翻译成python,那么我应该如何在python中做同样的事情呢?谢谢 public class LutG1Record { /// <summary>Instruc

下面是一个c#代码(整个项目太大),使用了一种我以前从未见过的新格式,我不知道如何将FieldOffset放在变量定义之前! 我试图使用此结构将浮点值=55分配给Field2Float,然后我意外地发现 Field2Int也会自动分配值1113325568,这是如何发生的?既然我正在将这段代码翻译成python,那么我应该如何在python中做同样的事情呢?谢谢

  public class LutG1Record
    {
        /// <summary>Instruction value.</summary>
        [FieldOffset(0)] public byte Instruction;
        /// <summary>First field value split into 3 bytes.</summary>
        [FieldOffset(1)] private byte field1b0;
        [FieldOffset(2)] private byte field1b1;
        [FieldOffset(3)] private byte field1b2;
        /// <summary>Instruction combined with Field1 in a 32-bit int.</summary>
        [FieldOffset(0)] private int InstructionAndField1;
        /// <summary>Second field value is an integer (use Field2Float to store a float).</summary>
        [FieldOffset(4)] public int Field2Int;
        /// <summary>Second field value is a float (use Field2Int to store an int).</summary>
        [FieldOffset(4)] public float Field2Float;
        /// <summary>
        /// This represents a 24 bit uint field.
        /// </summary>
我可以得到
result=0x005c42
然后,对于另一个值1113325568,它是
425c000
看起来Field2Float和Field2It只是读取相同的位置值

我不知道如何将FieldOffset放在变量定义之前

FieldOffset
是一个属性,类的全名是
FieldOffsetAttribute
。此特定属性可以放置在字段之前(或“打开”)

这是怎么发生的

此特定属性指示编译器“在彼此的顶部”生成字段,以便
Field2Int
Field2Float
解析到相同大小的相同内存位置(两个
int
float
的大小相同)

尽管您缺少这类声明中重要的后半部分,使用
struct
并使用
StructLayout
声明,否则编译器仍然或多或少地可以随意修改类定义


快速谷歌搜索显示,
struct.pack
可用于将
float
转换为
int
并在Python中按字节返回,这就是本示例所做的。顺便说一句,这不是在C#中实现这一点的唯一方法,您可以简单地将指向
int*
的指针重新解释为指向
float*
的指针,然后取消对它的引用,就像在C中一样。

为什么这个问题会标记为
C#-4.0
?您发布的代码中没有任何特定于C#4.0版的代码。首先为什么要使用
FieldOffset
?这是用于互操作的吗?要在Python中使用特定的结构布局,您应该阅读以下内容:@Dai,这是我感到困惑的,我从未见过这种格式,它是类成员的结构格式?只有C有这种格式?你说的“格式”是什么意思?另外,请回答我关于
lutg1记录的目的的问题。这是用于互操作还是不用于互操作?你熟悉结构化包装的概念吗?
var bytes = BitConverter.GetBytes(record.Field2Float);
var result = string.Format("0x{0:x}{1:x}{2:x}{3:x}", bytes[0], bytes[1], bytes[2], bytes[3]);