vellezz.info

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.