C/C# float與byte/u8 陣列的轉化

蘇守坤發表於2018-07-19

如有問題,請加扣扣群: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 位無符號整數。

相關文章