搜索
bottom↓
回复: 8

请问在C#里面,如何将四个字节组装成float 类型的数据?

[复制链接]

出0入0汤圆

发表于 2011-10-22 12:09:01 | 显示全部楼层 |阅读模式
我的下位机发送上了一帧数据里面有 32个字节,
里面包含了几个单精度浮点数据和一些整形。在c#里面,整形可以直接移位组装起来,但是浮点怎么办?我移位的时候他提示我不能移位。
那么我要怎么把四个字节组合成一个float呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-10-22 14:17:21 | 显示全部楼层
     // <summary>
      // 将浮点数转ASCII格式十六进制字符串(符合IEEE-754标准(32))
      // </summary>
      // <param name="data">浮点数值</param>
      // <returns>十六进制字符串</returns>
        public static string floatToIntString(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 & 0xff, 2));
            }
            return stringBuffer.ToString();
        }


      // <summary>
      // 将ASCII格式十六进制字符串转浮点数(符合IEEE-754标准(32))
      // </summary>
      // <param name="data">十六进制字符串</param>
      // <returns>浮点数值</returns>
        public static float intStringToFloat(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 = Convert.ToByte(data.Substring((3 - i) * 2, 2), 16);
                }
                return BitConverter.ToSingle(intBuffer, 0);
            }

        }

出0入0汤圆

发表于 2011-10-22 18:44:04 | 显示全部楼层
mark~~

出0入0汤圆

发表于 2011-10-22 18:59:18 | 显示全部楼层
你别用十六进制传啊,转成字符串

出0入0汤圆

发表于 2011-10-22 19:37:21 | 显示全部楼层
BitConverter 类

出0入0汤圆

 楼主| 发表于 2011-10-22 23:44:59 | 显示全部楼层
回复【3楼】first blood  
你别用十六进制传啊,转成字符串
-----------------------------------------------------------------------

没空转呀。。字符串数据量会大好多倍,转换也需要时间。转3个单精度浮点 STM32要用300~500us的时间。我整个系统周期才4ms。调试的时候有十多个浮点数和二十多个整形 字符型要传送。

之后需要转成无线数传,虽然传送的数据会少一些,但是要求最长要在20ms内传完。转成字符串的话,速度不够。

方法大概找到了,还是用copymemory。还没具体试过,头痛住。。

出0入0汤圆

发表于 2011-10-23 00:14:11 | 显示全部楼层
回复【5楼】majianjia  阿嘉^_^
-----------------------------------------------------------------------

用联合体……

出0入0汤圆

 楼主| 发表于 2011-10-23 08:42:56 | 显示全部楼层
回复【6楼】racede  
回复【5楼】majianjia  阿嘉^_^
-----------------------------------------------------------------------
用联合体……
-----------------------------------------------------------------------

C#里面可以用联合体?

出0入0汤圆

发表于 2011-10-23 10:31:15 | 显示全部楼层
回复【7楼】majianjia  阿嘉^_^
-----------------------------------------------------------------------

FieldOffset
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 21:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表