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