zoukankan      html  css  js  c++  java
  • 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);
                }
            }

  • 相关阅读:
    构建之法阅读笔记一
    第一冲刺阶段 工作总结 02
    第一冲刺阶段 工作总结 01
    学习进度条 第七周
    团队计划会议 01
    团队博客 一 需求分析
    学习进度条 第六周
    数组练习3 求最大连通子数组的和
    03构建之法阅读笔记之三
    团队项目个人每日总结(4.19)
  • 原文地址:https://www.cnblogs.com/xxaxx/p/5681726.html
Copyright © 2011-2022 走看看