Пример #1
0
            static Cache()
            {
                Type           = typeof(T);
                UnderlyingType = Enum.GetUnderlyingType(Type);
                Values         = (Enum.GetValues(Type) as T[]).AsReadOnly();
                Names          = Enum.GetNames(Type).Select(string.Intern).ToReadOnlyArray();
                Members        = Names.Select(x => new Member <T>(x)).ToReadOnlyArray();
                MinValue       = Values.DefaultIfEmpty().Min();
                MaxValue       = Values.DefaultIfEmpty().Max();
                IsEmpty        = Values.Count == 0;
                IsFlags        = Attribute.IsDefined(Type, typeof(FlagsAttribute));
                var distinctedMember = Members.OrderBy(x => x.Value).Distinct(new Member <T> .ValueComparer()).ToArray();

                MemberByName = Members.ToFrozenStringKeyDictionary(x => x.Name);
                UnderlyingOperation
                    = Type.GetTypeCode(Type) switch
                    {
                    TypeCode.SByte => SByteOperation <T> .Create(MinValue, MaxValue, distinctedMember),
                    TypeCode.Byte => ByteOperation <T> .Create(MinValue, MaxValue, distinctedMember),
                    TypeCode.Int16 => Int16Operation <T> .Create(MinValue, MaxValue, distinctedMember),
                    TypeCode.UInt16 => UInt16Operation <T> .Create(MinValue, MaxValue, distinctedMember),
                    TypeCode.Int32 => Int32Operation <T> .Create(MinValue, MaxValue, distinctedMember),
                    TypeCode.UInt32 => UInt32Operation <T> .Create(MinValue, MaxValue, distinctedMember),
                    TypeCode.Int64 => Int64Operation <T> .Create(MinValue, MaxValue, distinctedMember),
                    TypeCode.UInt64 => UInt64Operation <T> .Create(MinValue, MaxValue, distinctedMember),
                    _ => throw new InvalidOperationException(),
                    };
            }
Пример #2
0
 static void Cache <T>()
     where T : struct, Enum
 {
     var type              = typeof(T);
     var underlyingType    = Enum.GetUnderlyingType(type);
     var values            = ((T[])Enum.GetValues(type)).AsReadOnly();
     var names             = Enum.GetNames(type).ToReadOnlyArray();
     var members           = names.Select(x => new Member <T>(x)).ToReadOnlyArray();
     var minValue          = values.DefaultIfEmpty().Min();
     var maxValue          = values.DefaultIfEmpty().Max();
     var isEmpty           = values.Count == 0;
     var isFlags           = Attribute.IsDefined(type, typeof(FlagsAttribute));
     var distinctedMembers = members.Distinct(new Member <T> .ValueComparer()).ToArray();
     var memberByValue     = distinctedMembers.ToFrozenDictionary(x => x.Value);
     var memberByName      = members.ToFrozenStringKeyDictionary(x => x.Name);
     var underlyingOperation
         = Type.GetTypeCode(type) switch
         {
         TypeCode.SByte => SByteOperation <T> .Create(minValue, maxValue, distinctedMembers),
         TypeCode.Byte => ByteOperation <T> .Create(minValue, maxValue, distinctedMembers),
         TypeCode.Int16 => Int16Operation <T> .Create(minValue, maxValue, distinctedMembers),
         TypeCode.UInt16 => UInt16Operation <T> .Create(minValue, maxValue, distinctedMembers),
         TypeCode.Int32 => Int32Operation <T> .Create(minValue, maxValue, distinctedMembers),
         TypeCode.UInt32 => UInt32Operation <T> .Create(minValue, maxValue, distinctedMembers),
         TypeCode.Int64 => Int64Operation <T> .Create(minValue, maxValue, distinctedMembers),
         TypeCode.UInt64 => UInt64Operation <T> .Create(minValue, maxValue, distinctedMembers),
         _ => throw new InvalidOperationException(),
         };
 }
Пример #3
0
        /// <summary>
        ///获取行信息
        /// </summary>
        /// <param name="str">行字符串</param>
        /// <param name="count">通道数量</param>
        /// <returns>false--转换成功 true--失败</returns>
        public bool ByteToRow(byte[] data, int analogCount, int digitalCount)
        {
            try
            {
                //TODO:每次调用重复计算,影响效率
                int digital = GetUshortCount(digitalCount);

                int len = 4 + 4 + analogCount * 2 + digital * 2;
                if (data.Length < len)
                {
                    throw new ArgumentException("ByteToRow,字节数组长度小于要求值");
                }
                analogChannelData  = new UInt16[analogCount];
                digitalChannelData = new UInt16[digital];

                int index = 0;
                sampleNum = ByteOperation.CombinationByte(data[index++], data[index++], data[index++], data[index++]);
                timeStamp = ByteOperation.CombinationByte(data[index++], data[index++], data[index++], data[index++]);
                for (int j = 0; j < analogCount; j++)
                {
                    analogChannelData[j] = ByteOperation.CombinationByte(data[index++], data[index++]);
                }
                for (int j = 0; j < digital; j++)
                {
                    digitalChannelData [j] = ByteOperation.CombinationByte(data[index++], data[index++]);
                }

                return(true);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Пример #4
0
 /// <summary>
 /// 生成 二进制字节数组
 /// </summary>
 /// <returns>生成字符串</returns>
 public byte[] RowToByteArray()
 {
     try
     {
         int    len   = 4 + 4 + analogChannelData.Length * 2 + digitalChannelData.Length * 2;
         byte[] data  = new byte[len];
         int    index = 0;
         data[index++] = ByteOperation.GetBit7_0(sampleNum);
         data[index++] = ByteOperation.GetBit15_8(sampleNum);
         data[index++] = ByteOperation.GetBit23_16(sampleNum);
         data[index++] = ByteOperation.GetBit31_24(sampleNum);
         data[index++] = ByteOperation.GetBit7_0(timeStamp);
         data[index++] = ByteOperation.GetBit15_8(timeStamp);
         data[index++] = ByteOperation.GetBit23_16(timeStamp);
         data[index++] = ByteOperation.GetBit31_24(timeStamp);
         foreach (var m in analogChannelData)
         {
             data[index++] = ByteOperation.GetBit7_0(m);
             data[index++] = ByteOperation.GetBit15_8(m);
         }
         foreach (var m in digitalChannelData)
         {
             data[index++] = ByteOperation.GetBit7_0(m);
             data[index++] = ByteOperation.GetBit15_8(m);
         }
         return(data);
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
Пример #5
0
 /// <summary>
 /// Returns an indication whether a constant with a specified value exists in a specified enumeration.
 /// </summary>
 /// <param name="value"></param>
 /// <typeparam name="T">Enum type</typeparam>
 /// <returns></returns>
 public static bool IsDefined <T>(byte value)
     where T : struct, Enum
 {
     if (Cache_UnderlyingOperation <T> .UnderlyingType == typeof(byte))
     {
         return(ByteOperation <T> .IsDefined(ref value));
     }
     throw new ArgumentException(IsDefinedTypeMismatchMessage);
 }
Пример #6
0
        /// <summary>
        /// 获取状态位
        /// </summary>
        /// <param name="bitArray">位数组</param>
        /// <param name="posit">位置</param>
        /// <returns>位状态</returns>
        int GetDigitalBit(UInt16[] bitArray, UInt16 posit)
        {
            int  index  = posit / 16;
            int  offset = posit % 16;
            bool state  = ByteOperation.GetBit(bitArray[index], offset);

            if (state)
            {
                return(1);
            }
            else
            {
                return(0);
            }
        }
Пример #7
0
        private void ParseFlags(byte[] flagBytes)
        {
            this.TagAlterPreservation  = ByteOperation.GetBit(flagBytes[0], 6);
            this.FileAlterPreservation = ByteOperation.GetBit(flagBytes[0], 5);
            this.ReadOnly = ByteOperation.GetBit(flagBytes[0], 4);

            this.GroupingIdentity    = ByteOperation.GetBit(flagBytes[1], 6);
            this.Compression         = ByteOperation.GetBit(flagBytes[1], 3);
            this.Encryption          = ByteOperation.GetBit(flagBytes[1], 2);
            this.Unsynchronisation   = ByteOperation.GetBit(flagBytes[1], 1);
            this.DataLengthIndicator = ByteOperation.GetBit(flagBytes[1], 0);

            if (((flagBytes[0] & 0x8F) != 0) || ((flagBytes[1] & 0xB0) != 0))
            {
                throw new Exceptions.NotUsableFlagException("Invalid flag field in FrameFlagSet. Undefined flags are set", "", DateTime.Now);
            }
        }
Пример #8
0
        public BinaryContent(ASCIIContent assiiContent)
        {
            AnalogCount       = assiiContent.AnalogCount;
            DigitalCount      = assiiContent.DigitalCount;
            sampleNum         = (UInt32)assiiContent.SampleIndex;
            timeStamp         = (UInt32)assiiContent.SampleTimeStamp;
            analogChannelData = new ushort[AnalogCount];

            for (int i = 0; i < AnalogCount; i++)
            {
                analogChannelData[i] = (ushort)assiiContent.AnalogChannelData[i];
            }
            //  Array.Copy(assiiContent.AnalogChannelData, analogChannelData, AnalogCount);

            //int digital = GetUshortCount(DigitalCount);
            //digitalChannelData = new ushort[digital];
            digitalChannelData = ByteOperation.BitAssemblyUsort16(assiiContent.DigitalChannelData);
        }
Пример #9
0
        public void TestGetBit()
        {
            bool expTrue  = true;
            bool expFalse = false;

            byte byte01 = 0x01;
            byte byteCA = 0xCA;

            Assert.AreEqual(expTrue, ByteOperation.GetBit(byte01, 0));
            Assert.AreEqual(expFalse, ByteOperation.GetBit(byte01, 1));

            Assert.AreEqual(false, ByteOperation.GetBit(byteCA, 0));
            Assert.AreEqual(true, ByteOperation.GetBit(byteCA, 1));
            Assert.AreEqual(false, ByteOperation.GetBit(byteCA, 2));
            Assert.AreEqual(true, ByteOperation.GetBit(byteCA, 3));
            Assert.AreEqual(false, ByteOperation.GetBit(byteCA, 4));
            Assert.AreEqual(false, ByteOperation.GetBit(byteCA, 5));
            Assert.AreEqual(true, ByteOperation.GetBit(byteCA, 6));
            Assert.AreEqual(true, ByteOperation.GetBit(byteCA, 7));
        }
Пример #10
0
            static Cache_UnderlyingOperation()
            {
                var type       = Cache_Type <T> .Type;
                var min        = Cache_MinMaxValues <T> .MinValue;
                var max        = Cache_MinMaxValues <T> .MaxValue;
                var distincted = Cache_Members <T> .Members.OrderBy(x => x.Value).Distinct(new Member <T> .ValueComparer()).ToArray();

                UnderlyingType = Cache_Type <T> .UnderlyingType;
                UnderlyingOperation
                    = Type.GetTypeCode(type) switch
                    {
                    TypeCode.SByte => SByteOperation <T> .Create(min, max, distincted),
                    TypeCode.Byte => ByteOperation <T> .Create(min, max, distincted),
                    TypeCode.Int16 => Int16Operation <T> .Create(min, max, distincted),
                    TypeCode.UInt16 => UInt16Operation <T> .Create(min, max, distincted),
                    TypeCode.Int32 => Int32Operation <T> .Create(min, max, distincted),
                    TypeCode.UInt32 => UInt32Operation <T> .Create(min, max, distincted),
                    TypeCode.Int64 => Int64Operation <T> .Create(min, max, distincted),
                    TypeCode.UInt64 => UInt64Operation <T> .Create(min, max, distincted),
                    _ => throw new InvalidOperationException(),
                    };
            }
Пример #11
0
            static CacheUnderlyingOperation()
            {
                Type type = CacheType <T> .Type;
                T    min  = CacheMinMaxValues <T> .MinValue;
                T    max  = CacheMinMaxValues <T> .MaxValue;

                EnumMember <T>[] distincted = CacheMembers <T> .Members.OrderBy(x => x.Value).Distinct(new EnumMember <T> .ValueComparer()).ToArray();

                UnderlyingType = CacheType <T> .UnderlyingType;
                // ReSharper disable once SwitchExpressionHandlesSomeKnownEnumValuesWithExceptionInDefault
                UnderlyingOperation = Type.GetTypeCode(type) switch
                {
                    TypeCode.SByte => SByteOperation <T> .Create(min, max, distincted),
                    TypeCode.Byte => ByteOperation <T> .Create(min, max, distincted),
                    TypeCode.Int16 => Int16Operation <T> .Create(min, max, distincted),
                    TypeCode.UInt16 => UInt16Operation <T> .Create(min, max, distincted),
                    TypeCode.Int32 => Int32Operation <T> .Create(min, max, distincted),
                    TypeCode.UInt32 => UInt32Operation <T> .Create(min, max, distincted),
                    TypeCode.Int64 => Int64Operation <T> .Create(min, max, distincted),
                    TypeCode.UInt64 => UInt64Operation <T> .Create(min, max, distincted),
                    _ => throw new InvalidOperationException()
                };
            }
        }