在做上位机开发过程中,经常会碰到字节数组与浮点数,整数等数据之间的转换,有时为了验证数据是否解析正确,得借助于IEEE浮点数工具,本文把基于c#实现的浮点数与字节数组(或16进制的字符串)转换的实现方法分享如下:

       /// <summary>
/// 将二进制值转ASCII格式十六进制字符串
/// </summary>
/// <paramname="data">二进制值</param>
/// <paramname="length">定长度的二进制</param>
/// <returns>ASCII格式十六进制字符串</returns>
public static string toHexString(int data, int length)
{
string result = "";
if (data > )
result = Convert.ToString(data, ).ToUpper();
if (result.Length < length)
{
// 位数不够补0
StringBuilder msg = new StringBuilder();
msg.Length = ;
msg.Append(result);
for (; msg.Length < length; msg.Insert(, "")) ;
result = msg.ToString();
}
return result;
}
///<summary>
/// 将浮点数转ASCII格式十六进制字符串(符合IEEE-754标准(32))
/// </summary>
/// <paramname="data">浮点数值</param>
/// <returns>十六进制字符串</returns>
public static string FloatToIntString(float data)
{
byte[] intBuffer = BitConverter.GetBytes(data);
StringBuilder stringBuffer = new StringBuilder();
for (int i = ; i < intBuffer.Length; i++)
{
stringBuffer.Insert(, toHexString(intBuffer[i] & 0xff, ));
}
return stringBuffer.ToString();
} /// <summary>
/// 将ASCII格式十六进制字符串转浮点数(符合IEEE-754标准(32))
/// </summary>
/// <param name="data">16进制字符串</param>
/// <returns></returns>
public static float StringToFloat(String data)
{
if (data.Length < || data.Length > )
{
//throw new NotEnoughDataInBufferException(data.length(), 8);
return ;
}
else
{
byte[] intBuffer = new byte[];
// 将16进制串按字节逆序化(一个字节2个ASCII码)
for (int i = ; i < ; i++)
{
intBuffer[i] = Convert.ToByte(data.Substring(( - i) * , ), );
}
return BitConverter.ToSingle(intBuffer, );
}
}
/// <summary>
/// 将byte数组转为浮点数
/// </summary>
/// <param name="bResponse">byte数组</param>
/// <returns></returns>
public static float ByteToFloat(byte[] bResponse)
{
if (bResponse.Length < || bResponse.Length > )
{
//throw new NotEnoughDataInBufferException(data.length(), 8);
return ;
}
else
{
byte[] intBuffer = new byte[];
//将byte数组的前后两个字节的高低位换过来
intBuffer[] = bResponse[];
intBuffer[] = bResponse[];
intBuffer[] = bResponse[];
intBuffer[] = bResponse[];
return BitConverter.ToSingle(intBuffer, );
}
}
/// <summary>
/// 用指针方式强制将byte数组转为浮点数
/// </summary>
/// <param name="bResponse"></param>
/// <returns></returns>
public static float BytetoFloatByPoint(byte[] bResponse)
{
//uint nRest = ((uint)response[startByte]) * 256 + ((uint)response[startByte + 1]) + 65536 * ((uint)response[startByte + 2]) * 256 + ((uint)response[startByte + 3]);
float fValue = 0f;
uint nRest = ((uint)bResponse[]) *
+ ((uint)bResponse[]) +
* (((uint)bResponse[]) * + ((uint)bResponse[]));
//用指针将整形强制转换成float
unsafe
{
float* ptemp;
ptemp = (float*)(&nRest);
fValue = *ptemp;
}
return fValue;
}

注意:有时从串口(或其它设备读到的字节有高低位之分,在作为参数传递前把他们的顺序调整过来即可)

最新文章

  1. ASP.NET获取百度地图提供的API接口里面的JSON
  2. Code First 迁移
  3. 昨晚值班将发dla的程序改好后放入正式环境
  4. HDU 5213 Lucky 莫队+容斥
  5. NOIP201302表达式求值
  6. 手动编译Jsp文件
  7. 流媒体相关知识介绍 及其 RTP 应用
  8. linux sar 命令详解
  9. javascript笔记——jsonp
  10. Java Spring 中你不知道的注入方式
  11. HOG算子
  12. JS判断浏览器类型与版本
  13. 【zkw费用流】[网络流24题]餐巾计划问题
  14. Linux2.6--虚拟文件系统
  15. C#简单继承示例详解——快速入门
  16. java调用monkeyrunner(亲测绝对可行)
  17. LOJ.6281.数列分块入门5(分块 区间开方)
  18. Delphi 7调用C语言编写的DLL
  19. numpy深入理解剖析
  20. python log封装

热门文章

  1. 前台获取Dropdownlist选中的text
  2. post- build event
  3. java随笔
  4. paper 124:【转载】无监督特征学习——Unsupervised feature learning and deep learning
  5. VIM 常用快捷键
  6. 【Ngui 学习系列之一:简单组件的操作】
  7. 数据绑定控件之Repeater
  8. Java线程:线程的同步与锁
  9. https基础流程
  10. JS数组操作示意图(shift,unshift,pop,push)