Il linguaggio C ci fornisce il comodo costrutto union utile per esempio per convertire variabili o strutture di tipo diverso ma di eguale dimensione.
In C# il costrutto union non esiste, esistono al suo posto le classi StructLayoutAttribute e FieldOffsetAttribute entrambe appartenneti al namespace System.Runtime.InteropServices. La StructLayoutAttribute può essere applicata a dei costrutti di tipo class o struct mentre la FieldOffsetAttribute viene applicata ai membri della classe o struttura.
Supponendo di voler convertire un Int16 (intero a 16 bit) in due byte (8 bit) e viceversa possiamo utilizzare il seguente costrutto:
[StructLayout(LayoutKind.Explicit, Size = 2)]
struct U16B
{
[FieldOffset(0)]
public byte B1;
[FieldOffset(1)]
public byte B2;
[FieldOffset(0)]
public Int16 I16;
}
struct U16B
{
[FieldOffset(0)]
public byte B1;
[FieldOffset(1)]
public byte B2;
[FieldOffset(0)]
public Int16 I16;
}
Questo crea una struttura con i cambi I16 e B1, B2 che condividono gli stessi 2 byte di memoria in maniera del tutto analoga alle union del C.
Anche l'uso è del tutto analogo.
Per convertire l'intero nei due byte che lo compongono si usa il seguente codice:
Int16 a = 12345;
byte[] b = new byte[2];
U16B u = new U16B();
u.I16 = a;
u.I16 = a;
b[1] = u.B2;
b[0] = u.B1;
b[0] = u.B1;
La documentazione di riferimento si può trovare qui:
Nessun commento:
Posta un commento