C style Union w C#
Feb
27
Unia to typ danych grupujący wiele różnych sposobów interpretacji tego samego fragmentu pamięci. W C# ten typ danych jest możliwy do implementacji z wykorzystaniem struct i atrybutu StructLayout.
Snippet na DotNetFiddle
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
public struct MacAddress
{
[FieldOffset(0)] public byte _first_nibblet;
[FieldOffset(1)] public byte _second_nibblet;
[FieldOffset(2)] public byte _third_nibblet;
[FieldOffset(3)] public byte _fourth_nibblet;
[FieldOffset(0)] public float _mac;
public MacAddress(string mac)
{
this._mac = new int();
var bytes = StringToByteArray(mac);
this._first_nibblet = bytes[0];
this._second_nibblet = bytes[1];
this._third_nibblet = bytes[2];
this._fourth_nibblet = bytes[3];
}
public static byte[] StringToByteArray(string hex)
{
var NumberChars = hex.Length;
var bytes = new byte[NumberChars / 2];
for(var i = 0; i < NumberChars; i += 2)
bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
return bytes;
}
}
public class Program
{
private static string BytesToHexString(byte b)
{
return BitConverter.ToString(new[] {b});
}
public static void Main(string[] args)
{
var mac = new MacAddress("AABBCCDD");
Console.WriteLine(BitConverter.ToString(BitConverter.GetBytes(mac._mac)));
Console.WriteLine(string.Format("{0}-{1}-{2}-{3}", BytesToHexString(mac._first_nibblet),
BytesToHexString(mac._second_nibblet), BytesToHexString(mac._third_nibblet),
BytesToHexString(mac._fourth_nibblet)));
Console.ReadLine();
}
#endregion
}
Comments
Comments are closed.