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類中的函式進行轉換,如下:
名稱 |
說明 |
以位元組陣列的形式返回指定的雙精度浮點值。 |
|
以位元組陣列的形式返回指定的單精度浮點值。 |
|
返回由位元組陣列中指定位置的八個位元組轉換來的雙精度浮點數。 |
|
返回由位元組陣列中指定位置的四個位元組轉換來的單精度浮點數。 |
BitConverter類進行基礎資料型別與位元組陣列之間的相互轉換,此類便於操作基本形式的型別。一個位元組定義為一個 8位無符號整數。包含的方法如下:
名稱 |
說明 |
將指定的雙精度浮點數轉換為 64 位有符號整數。 |
|
以位元組陣列的形式返回指定的布林值。 |
|
以位元組陣列的形式返回指定的 Unicode 字元值。 |
|
以位元組陣列的形式返回指定的雙精度浮點值。 |
|
以位元組陣列的形式返回指定的 16 位有符號整數值。 |
|
以位元組陣列的形式返回指定的 32 位有符號整數值。 |
|
以位元組陣列的形式返回指定的 64 位有符號整數值。 |
|
以位元組陣列的形式返回指定的單精度浮點值。 |
|
以位元組陣列的形式返回指定的 16 位無符號整數值。 |
|
以位元組陣列的形式返回指定的 32 位無符號整數值。 |
|
以位元組陣列的形式返回指定的 64 位無符號整數值。 |
|
將指定的 64 位有符號整數轉換成雙精度浮點數。 |
|
返回由位元組陣列中指定位置的一個位元組轉換來的布林值。 |
|
返回由位元組陣列中指定位置的兩個位元組轉換來的 Unicode 字元。 |
|
返回由位元組陣列中指定位置的八個位元組轉換來的雙精度浮點數。 |
|
返回由位元組陣列中指定位置的兩個位元組轉換來的 16 位有符號整數。 |
|
返回由位元組陣列中指定位置的四個位元組轉換來的 32 位有符號整數。 |
|
返回由位元組陣列中指定位置的八個位元組轉換來的 64 位有符號整數。 |
|
返回由位元組陣列中指定位置的四個位元組轉換來的單精度浮點數。 |
|
將指定的位元組陣列的每個元素的數值轉換為它的等效十六進位制字串表示形式。 |
|
將指定的位元組子陣列的每個元素的數值轉換為它的等效十六進位制字串表示形式。 |
|
將指定的位元組子陣列的每個元素的數值轉換為它的等效十六進位制字串表示形式。 |
|
返回由位元組陣列中指定位置的兩個位元組轉換來的 16 位無符號整數。 |
|
返回由位元組陣列中指定位置的四個位元組轉換來的 32 位無符號整數。 |
|
返回由位元組陣列中指定位置的八個位元組轉換來的 64 位無符號整數。 |
相關文章
- C# byte陣列與Image相互轉換的方法C#陣列
- C# string byte陣列轉換解析C#陣列
- float與byte[]互相轉換
- C#位元組陣列byte[]和字串string如何互相轉換C#陣列字串
- C#中byte[] 與string相互轉化問題C#
- byte陣列轉字串?陣列字串
- C#位元組陣列與字串轉換C#陣列字串
- C#初始化陣列C#陣列
- u8 陣列轉換成 string陣列
- C# 將Byte[]位元組陣列存入 sqlite 資料庫C#陣列SQLite資料庫
- C#陣列與集合的區別C#陣列
- c#列舉與陣列初始化及使用小記C#陣列
- 轉 IOS---NSdata 與 NSString,Byte陣列,UIImage 的相互轉換iOS陣列UI
- C#陣列相乘C#陣列
- C#陣列教程C#陣列
- c# 陣列排序C#陣列排序
- C# 陣列的複製C#陣列
- C#實現控制元件陣列 (轉)C#控制元件陣列
- C#陣列引數C#陣列
- c# 陣列學習C#陣列
- 陣列與集合List的相互轉化陣列
- C#:檔案、byte[]、Stream相互轉換C#
- C#結構體和位元組陣列的轉換C#結構體陣列
- string和byte[]之間的轉換 (C#)C#
- 瞭解下C# 陣列(Array)C#陣列
- C#中複製陣列C#陣列
- C#陣列教程之2C#陣列
- C#陣列教程之3C#陣列
- 使用Java完成byte陣列與十六進位制字串相互轉換Java陣列字串
- c#簡單實現二維陣列和二維陣列列表List<>的轉置C#陣列
- C# 一維陣列如何快速實現陣列元素的資料型別的轉換?C#陣列資料型別
- C#快速入門教程(19)—— 索引器與陣列C#索引陣列
- byte位元組陣列 轉換成double型別陣列型別
- C# int與string轉化C#
- android byte[]陣列,bitmap,drawable之間的相互轉換Android陣列
- c# long?與long的轉化程式碼C#
- java的byte陣列的不同寫法Java陣列
- 將byte[]陣列轉換為影像輸出到頁面陣列