| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 | namespace Universal;public class UnionHelper{    public static void GetByteUnion(byte input, out bool[] bits)    {        bits = new bool[8];        for (int i = 0; i < 8; i++)            bits[i] = Convert.ToBoolean((input >> i) & 0b01);    }    public static void GetByteUnion(byte input, out byte[] bits)    {        bits = new byte[8];        for (int i = 0; i < 8; i++)            bits[i] = (byte)((input >> i) & 0b01);    }}public class StructHelper{    public static byte[] StructToBytes<T>(T structObj) where T : struct    {        int size = Marshal.SizeOf(structObj);        IntPtr buffer = Marshal.AllocHGlobal(size);        try        {            Marshal.StructureToPtr(structObj, buffer, false);            byte[] bytes = new byte[size];            Marshal.Copy(buffer, bytes, 0, size);            return bytes;        }        finally        {            Marshal.FreeHGlobal(buffer);        }    }    public static T BytesToStruct<T>(byte[] bytes) where T : struct    {        int size = Marshal.SizeOf<T>();        IntPtr buffer = Marshal.AllocHGlobal(size);        try        {            Marshal.Copy(bytes, 0, buffer, size);            return Marshal.PtrToStructure<T>(buffer);        }        finally        {            Marshal.FreeHGlobal(buffer);        }    }    public static byte[] Ushorts2Bytes(ushort[] src, bool reverse = false)    {        int count = src.Length;        byte[] dest = new byte[count << 1];        if (reverse)        {            for (int i = 0; i < count; i++)            {                dest[i * 2] = (byte)(src[i] >> 8);                dest[i * 2 + 1] = (byte)(src[i] >> 0);            }        }        else        {            for (int i = 0; i < count; i++)            {                dest[i * 2] = (byte)(src[i] >> 0);                dest[i * 2 + 1] = (byte)(src[i] >> 8);            }        }        return dest;    }    public static ushort[] Bytes2Ushorts(byte[] src, bool reverse = false)    {        int len = src.Length;        byte[] srcPlus = new byte[len + 1];        src.CopyTo(srcPlus, 0);        int count = len >> 1;        if (len % 2 != 0)        {            count += 1;        }        ushort[] dest = new ushort[count];        if (reverse)        {            for (int i = 0; i < count; i++)            {                dest[i] = (ushort)(srcPlus[i * 2] << 8 | srcPlus[2 * i + 1] & 0xff);            }        }        else        {            for (int i = 0; i < count; i++)            {                dest[i] = (ushort)(srcPlus[i * 2] & 0xff | srcPlus[2 * i + 1] << 8);            }        }        return dest;    }}
 |