C/C# float与byte/u8 数组的转化

如有问题,请加扣扣群:460189483

编程语言主要采用IEEE754来存储浮点数,这里有IEEE标准的介(百度百科),或者这里 (知乎:IEEE 754格式是什么?)

在C语言中对于float,用4字节存储,

比如

1.618000  ,在内存中为 160  26 207    63

1.000000,  在内存中为  0      0    128    63

那么我有4个字节数据,比如{160  26 207    63},怎么转成float呢?

在嵌入式开发中经常要用到通讯,将float类型数据上传到Windows等监控上位机,在这里只能将float数据转化为unsigned char 类型数组,那怎么转化呢,这里提供了几种方法:

1. 下位机定义float数值

  使用union联合体进行转化,例如

typedef union 
{
    float a;
    u8 b[4];
}float_t;   

程序中定义数据类型:float_t  test;

test.a=3.14f; 则可以获得对应的U8类型数组b[]={0XC3,0XF5,0X48,0X40};将这个数组传给上位机即可

2. 上位机Windows接收到数值处理

使用C#开发的桌面程序接收到数值之后怎么处理呢?可以采用

float f = BitConverter.ToSingle(b, 0);

将接收的数值转化为float类型的数值

3. Windows上位机发送float类型数值

float f=3.14f;

byte[] b = BitConverter.GetBytes(f);

这样就可以将float类型数值转化为byte类型,通过串口下发下位机即可        

4. 下位机接收到float类型

此处有2种方法,一种是使用联合体的方法

test.b[0] = 接收[0]

test.b[1] = 接收[1]

test.b[2] = 接收[2]

test.b[3] = 接收[3]

此处注意大小端对齐,上位机下位机大小端要注意一下

第二种方法是使用指针的方法

float temp;    
unsigned char *p = (unsigned char*)&temp;

   p[0]=接收[0]; 
   p[1]=接收[1]; 
   p[2]=接收[2];
   p[3]=接收[3];

这样也可以将内存中的数据转化为float类型的数值

这样就完成了下位机与上位机之间float类型数据互传的问题

下面加一些常用的API供参考

在c#中可以使用BitConverter类中的函数进行转换,如下:

名称

说明

GetBytes(Double)

以字节数组的形式返回指定的双精度浮点值。

GetBytes(Single)

以字节数组的形式返回指定的单精度浮点值。

ToDouble

返回由字节数组中指定位置的八个字节转换来的双精度浮点数。

ToSingle

返回由字节数组中指定位置的四个字节转换来的单精度浮点数。

BitConverter类进行基础数据类型与字节数组之间的相互转换,此类便于操作基本形式的类型。一个字节定义为一个 8位无符号整数。包含的方法如下:

名称

说明

DoubleToInt64Bits

将指定的双精度浮点数转换为 64 位有符号整数。

GetBytes(Boolean)

以字节数组的形式返回指定的布尔值。

GetBytes(Char)

以字节数组的形式返回指定的 Unicode 字符值。

GetBytes(Double)

以字节数组的形式返回指定的双精度浮点值。

GetBytes(Int16)

以字节数组的形式返回指定的 16 位有符号整数值。

GetBytes(Int32)

以字节数组的形式返回指定的 32 位有符号整数值。

GetBytes(Int64)

以字节数组的形式返回指定的 64 位有符号整数值。

GetBytes(Single)

以字节数组的形式返回指定的单精度浮点值。

GetBytes(UInt16)

以字节数组的形式返回指定的 16 位无符号整数值。

GetBytes(UInt32)

以字节数组的形式返回指定的 32 位无符号整数值。

GetBytes(UInt64)

以字节数组的形式返回指定的 64 位无符号整数值。

Int64BitsToDouble

将指定的 64 位有符号整数转换成双精度浮点数。

ToBoolean

返回由字节数组中指定位置的一个字节转换来的布尔值。

ToChar

返回由字节数组中指定位置的两个字节转换来的 Unicode 字符。

ToDouble

返回由字节数组中指定位置的八个字节转换来的双精度浮点数。

ToInt16

返回由字节数组中指定位置的两个字节转换来的 16 位有符号整数。

ToInt32

返回由字节数组中指定位置的四个字节转换来的 32 位有符号整数。

ToInt64

返回由字节数组中指定位置的八个字节转换来的 64 位有符号整数。

ToSingle

返回由字节数组中指定位置的四个字节转换来的单精度浮点数。

ToString( array<Byte []()>[])

将指定的字节数组的每个元素的数值转换为它的等效十六进制字符串表示形式。

ToString( array<Byte []()>[], Int32)

将指定的字节子数组的每个元素的数值转换为它的等效十六进制字符串表示形式。

ToString( array<Byte []()>[], Int32, Int32)

将指定的字节子数组的每个元素的数值转换为它的等效十六进制字符串表示形式。

ToUInt16

返回由字节数组中指定位置的两个字节转换来的 16 位无符号整数。

ToUInt32

返回由字节数组中指定位置的四个字节转换来的 32 位无符号整数。

ToUInt64

返回由字节数组中指定位置的八个字节转换来的 64 位无符号整数。

猜你喜欢

转载自blog.csdn.net/u014453443/article/details/81119724