• 详解S7源码2----Conversition


    1,数据转换

    • BinStringToInt32;将类似"01110001100"的转为Int32.
    • BinStringToByte;将类似"01110001100"的转为Byte.
    • ValToBinString:将类似Byte,Int,Dint,等整型转为BinString.
    • SelectBit:查询Byte中某个位的值.
    • short---ushort转换.
    • int---UInt转换(读取的都是无符号).
    • double---首先转为byte[]再转为double.
     public static class Conversion
        {
            /// <summary>
            /// Converts a binary string to Int32 value
            /// </summary>
            /// <param name="txt"></param>
            /// <returns></returns>
            public static int BinStringToInt32(this string txt)
            {
                int ret = 0;
    
                for (int i = 0; i < txt.Length; i++)
                {
                    ret = (ret << 1) | ((txt[i] == '1') ? 1 : 0);
                }
                return ret;
            }
    
            /// <summary>
            /// Converts a binary string to a byte. Can return null.
            /// </summary>
            /// <param name="txt"></param>
            /// <returns></returns>
            public static byte? BinStringToByte(this string txt)
            {
                if (txt.Length == 8) return (byte)BinStringToInt32(txt);
                return null;
            }
    
            /// <summary>
            /// Converts the value to a binary string
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public static string ValToBinString(this object value)
            {
                int cnt = 0;
                int cnt2 = 0;
                int x = 0;
                string txt = "";
                long longValue = 0;
    
                try
                {
                    if (value.GetType().Name.IndexOf("[]") < 0)
                    {
                        // ist nur ein Wert
                        switch (value.GetType().Name)
                        {
                            case "Byte":
                                x = 7;
                                longValue = (long)((byte)value);
                                break;
                            case "Int16":
                                x = 15;
                                longValue = (long)((Int16)value);
                                break;
                            case "Int32":
                                x = 31;
                                longValue = (long)((Int32)value);
                                break;
                            case "Int64":
                                x = 63;
                                longValue = (long)((Int64)value);
                                break;
                            default:
                                throw new Exception();
                        }
    
                        for (cnt = x; cnt >= 0; cnt += -1)
                        {
                            if (((Int64)longValue & (Int64)Math.Pow(2, cnt)) > 0)
                                txt += "1";
                            else
                                txt += "0";
                        }
                    }
                    else
                    {
                        // ist ein Array
                        switch (value.GetType().Name)
                        {
                            case "Byte[]":
                                x = 7;
                                byte[] ByteArr = (byte[])value;
                                for (cnt2 = 0; cnt2 <= ByteArr.Length - 1; cnt2++)
                                {
                                    for (cnt = x; cnt >= 0; cnt += -1)
                                        if ((ByteArr[cnt2] & (byte)Math.Pow(2, cnt)) > 0) txt += "1"; else txt += "0";
                                }
                                break;
                            case "Int16[]":
                                x = 15;
                                Int16[] Int16Arr = (Int16[])value;
                                for (cnt2 = 0; cnt2 <= Int16Arr.Length - 1; cnt2++)
                                {
                                    for (cnt = x; cnt >= 0; cnt += -1)
                                        if ((Int16Arr[cnt2] & (byte)Math.Pow(2, cnt)) > 0) txt += "1"; else txt += "0";
                                }
                                break;
                            case "Int32[]":
                                x = 31;
                                Int32[] Int32Arr = (Int32[])value;
                                for (cnt2 = 0; cnt2 <= Int32Arr.Length - 1; cnt2++)
                                {
                                    for (cnt = x; cnt >= 0; cnt += -1)
                                        if ((Int32Arr[cnt2] & (byte)Math.Pow(2, cnt)) > 0) txt += "1"; else txt += "0";
                                }
                                break;
                            case "Int64[]":
                                x = 63;
                                byte[] Int64Arr = (byte[])value;
                                for (cnt2 = 0; cnt2 <= Int64Arr.Length - 1; cnt2++)
                                {
                                    for (cnt = x; cnt >= 0; cnt += -1)
                                        if ((Int64Arr[cnt2] & (byte)Math.Pow(2, cnt)) > 0) txt += "1"; else txt += "0";
                                }
                                break;
                            default:
                                throw new Exception();
                        }
                    }
                    return txt;
                }
                catch
                {
                    return "";
                }
            }
    
            /// <summary>
            /// Helper to get a bit value given a byte and the bit index.
            /// Example: DB1.DBX0.5 -> var bytes = ReadBytes(DB1.DBW0); bool bit = bytes[0].SelectBit(5); 
            /// </summary>
            /// <param name="data"></param>
            /// <param name="bitPosition"></param>
            /// <returns></returns>
            public static bool SelectBit(this byte data, int bitPosition)
            {
                int mask = 1 << bitPosition;
                int result = data & mask;
    
                return (result != 0);
            }
    
            /// <summary>
            /// Converts from ushort value to short value; it's used to retrieve negative values from words
            /// </summary>
            /// <param name="input"></param>
            /// <returns></returns>
            public static short ConvertToShort(this ushort input)
            {
                short output;
                output = short.Parse(input.ToString("X"), NumberStyles.HexNumber);
                return output;
            }
    
            /// <summary>
            /// Converts from short value to ushort value; it's used to pass negative values to DWs
            /// </summary>
            /// <param name="input"></param>
            /// <returns></returns>
            public static ushort ConvertToUshort(this short input)
            {
                ushort output;
                output = ushort.Parse(input.ToString("X"), NumberStyles.HexNumber);
                return output;
            }
    
            /// <summary>
            /// Converts from UInt32 value to Int32 value; it's used to retrieve negative values from DBDs
            /// </summary>
            /// <param name="input"></param>
            /// <returns></returns>
            public static Int32 ConvertToInt(this uint input)
            {
                int output;
                output = int.Parse(input.ToString("X"), NumberStyles.HexNumber);
                return output;
            }
    
            /// <summary>
            /// Converts from Int32 value to UInt32 value; it's used to pass negative values to DBDs
            /// </summary>
            /// <param name="input"></param>
            /// <returns></returns>
            public static UInt32 ConvertToUInt(this int input)
            {
                uint output;
                output = uint.Parse(input.ToString("X"), NumberStyles.HexNumber);
                return output;
            }
    
            /// <summary>
            /// Converts from double to DWord (DBD)
            /// </summary>
            /// <param name="input"></param>
            /// <returns></returns>
            public static UInt32 ConvertToUInt(this double input)
            {
                uint output;
                output = S7.Net.Types.DWord.FromByteArray(S7.Net.Types.Double.ToByteArray(input));
                return output;
            }
    
            /// <summary>
            /// Converts from DWord (DBD) to double
            /// </summary>
            /// <param name="input"></param>
            /// <returns></returns>
            public static double ConvertToDouble(this uint input)
            {
                double output;
                output = S7.Net.Types.Double.FromByteArray(S7.Net.Types.DWord.ToByteArray(input));
                return output;
            }
        }
    
  • 相关阅读:
    Java多态性理解
    多态详解
    public static void main(String[] args){}函数诠释
    继承、封装
    面向对象的理解
    重载与构造函数的解析
    冒泡排序及二分查找
    数组总结之补充
    计算机中如何表示数字-07IEEE754浮点数标准
    synchronized 和ReentrantLock
  • 原文地址:https://www.cnblogs.com/frogkiller/p/14678613.html
Copyright © 2020-2023  润新知