(转)C#中浮点数依IEEE-754标准转二进制串

因工作需要,把再串口通信中浮点数与字节流的数据转换函数放在这,转发的,谢谢原作者。

今天花了一天的时间搜罗资料,为了解决一个串口编程的进制转化问题。因为串口传送的浮点数据格式与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);
            }
        }

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值