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);
            }
        }

posted @ 2016-07-18 16:19  clown  阅读(6126)  评论(1编辑  收藏  举报