#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.