запутанное определение в переменных класса C #

#c#

#c#

Вопрос:

следующее находится в коде c # (весь проект слишком большой) с новым форматом, который я никогда раньше не видел, я не знаю, как FieldOffset можно поместить перед определением переменной! Я пытаюсь использовать эту структуру для присвоения значения float= 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>
  

обновление: для значения с плавающей запятой = 55,0, если я использую

 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]);
  

Тогда я мог бы получить result = 0x005c42
другое значение 1113325568, 425c0000
так что оба Field2Float и Field2Int просто считывают одно и то же значение местоположения?

Комментарии:

1. Почему этот вопрос помечен C#-4.0 ? В опубликованном вами коде нет ничего специфичного для версии 4.0 C #.

2. Почему вы используете FieldOffset в первую очередь? Это для взаимодействия?

3. Чтобы использовать конкретные макеты структур в Python, вы должны прочитать это: pymotw.com/2/struct

4. @Dai, это меня смущает, я никогда не видел этот формат, это формат структуры для члена класса? только C # имеет этот формат?

5. Что вы подразумеваете под «форматом»? Кроме того, пожалуйста, ответьте на мой вопрос о назначении LutG1Record . Это для взаимодействия или нет? И знакомы ли вы с концепцией упаковки структур?

Ответ №1:

Я не знаю, как FieldOffset можно поместить перед определением переменной!

FieldOffset является атрибутом, а полное имя класса является FieldOffsetAttribute . Этот конкретный атрибут может быть размещен перед (или «на») полями.

как это происходит?

Этот конкретный атрибут предписывает компилятору генерировать поля «друг над другом», so Field2Int и Field2Float разрешать в одни и те же ячейки памяти одинакового размера (оба int и float имеют одинаковый размер).

Хотя вы упускаете важную вторую половину таких объявлений, используйте a struct и объявляйте его с StructLayout помощью , в противном случае компилятор по-прежнему более или менее свободен в искажении определения вашего класса.

Быстрый поиск в Google показывает struct.pack , что его можно использовать для преобразования float в int и обратно по байтам в Python, что и делает этот пример. Кстати, это не единственный способ сделать это в C #, вы можете просто переинтерпретировать указатель на int* в указатель на float* , а затем разыменовать его, как и в C.