C#中浮點數依IEEE-754標准轉二進制串 (MODBUS 浮點數轉換)


因工作需要,把再串口通信中浮點數與字節流的數據轉換函數放在這,轉發的,謝謝原作者。

今天花了一天的時間搜羅資料,為了解決一個串口編程的進制轉化問題。因為串口傳送的浮點數據格式與IEEE-754標准(32)有關。此標准長度為32位,四個字節的浮點數據傳送順序為先低字節后高字節,作為8個ASCII碼傳送。格式:D31符號位(1位表正負),D30~D23價碼(8位),D22~D0尾數(23位)。

希望能夠研究此塊的同行們提供些幫助,下面是C#的轉化方法:

         /// <summary>
         /// 將二進制值轉ASCII格式十六進制字符串
         /// </summary>
         /// <paramname="data">二進制值</param>
         /// <paramname="length">定長度的二進制</param>
         /// <returns>ASCII格式十六進制字符串</returns>
         public static string toHexString(intdata, int length)
         {
             stringresult = "";
             if (data> 0)
                result = Convert.ToString(data, 16).ToUpper();
             if(result.Length < length)
             {
                // 位數不夠補0
                StringBuilder msg = new StringBuilder(0);
                msg.Length = 0;
                msg.Append(result);
                for (; msg.Length < length; msg.Insert(0, "0"));
                result = msg.ToString();
             }
             returnresult;
        }       

        ///<summary>
         /// 將浮點數轉ASCII格式十六進制字符串(符合IEEE-754標准(32))
         /// </summary>
         /// <paramname="data">浮點數值</param>
         /// <returns>十六進制字符串</returns>
         public static stringfloatToIntString(float data)
         {
             byte[]intBuffer = BitConverter.GetBytes(data);
            StringBuilder stringBuffer = new StringBuilder(0);
             for (int i =0; i < intBuffer.Length; i++)
             {
                stringBuffer.Insert(0, toHexString(intBuffer[i] & 0xff, 2));
             }
             returnstringBuffer.ToString();
         }

        ///<summary>
         /// 將ASCII格式十六進制字符串轉浮點數(符合IEEE-754標准(32))
         /// </summary>
         /// <paramname="data">十六進制字符串</param>
         /// <returns>浮點數值</returns>
         public static floatintStringToFloat(String data)
         {
             if(data.Length < 8 || data.Length > 8)
             {
                //throw new NotEnoughDataInBufferException(data.length(), 8);
                throw (new ApplicationException("緩存中的數據不完整。"));
             }
             else
             {
                byte[] intBuffer = new byte[4];
                // 將16進制串按字節逆序化(一個字節2個ASCII碼)
                for(int i=0; i<4; i++)
                {
                    intBuffer[i] = Convert.ToByte(data.Substring((3 - i) * 2, 2),16);   
                }
                return BitConverter.ToSingle(intBuffer, 0);
             }
         }

 

 

因工作需要,把再串口通信中浮點數與字節流的數據轉換函數放在這,轉發的,謝謝原作者。

今天花了一天的時間搜羅資料,為了解決一個串口編程的進制轉化問題。因為串口傳送的浮點數據格式與IEEE-754標准(32)有關。此標准長度為32位,四個字節的浮點數據傳送順序為先低字節后高字節,作為8個ASCII碼傳送。格式:D31符號位(1位表正負),D30~D23價碼(8位),D22~D0尾數(23位)。

希望能夠研究此塊的同行們提供些幫助,下面是C#的轉化方法:
        /// <summary>
        /// 將二進制值轉ASCII格式十六進制字符串
        /// </summary>
        /// <paramname="data">二進制值</param>
        /// <paramname="length">定長度的二進制</param>
        /// <returns>ASCII格式十六進制字符串</returns>
        public static string toHexString(intdata, int length)
        {
            stringresult = "";
            if (data> 0)
               result = Convert.ToString(data, 16).ToUpper();
            if(result.Length < length)
            {
               // 位數不夠補0
               StringBuilder msg = new StringBuilder(0);
               msg.Length = 0;
               msg.Append(result);
               for (; msg.Length < length; msg.Insert(0, "0"));
               result = msg.ToString();
            }
            returnresult;
       }       

        ///<summary>
        /// 將浮點數轉ASCII格式十六進制字符串(符合IEEE-754標准(32))
        /// </summary>
        /// <paramname="data">浮點數值</param>
        /// <returns>十六進制字符串</returns>
        public static stringfloatToIntString(float data)
        {
            byte[]intBuffer = BitConverter.GetBytes(data);
           StringBuilder stringBuffer = new StringBuilder(0);
            for (int i =0; i < intBuffer.Length; i++)
            {
               stringBuffer.Insert(0, toHexString(intBuffer[i] & 0xff, 2));
            }
            returnstringBuffer.ToString();
        }

        ///<summary>
        /// 將ASCII格式十六進制字符串轉浮點數(符合IEEE-754標准(32))
        /// </summary>
        /// <paramname="data">十六進制字符串</param>
        /// <returns>浮點數值</returns>
        public static floatintStringToFloat(String data)
        {
            if(data.Length < 8 || data.Length > 8)
            {
               //throw new NotEnoughDataInBufferException(data.length(), 8);
               throw (new ApplicationException("緩存中的數據不完整。"));
            }
            else
            {
               byte[] intBuffer = new byte[4];
               // 將16進制串按字節逆序化(一個字節2個ASCII碼)
               for(int i=0; i<4; i++)
               {
                   intBuffer[i] = Convert.ToByte(data.Substring((3 - i) * 2, 2),16);   
               }
               return BitConverter.ToSingle(intBuffer, 0);
            }
        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM