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 位無符號整數。 |
相關文章
- float與byte[]互相轉換
- C#位元組陣列byte[]和字串string如何互相轉換C#陣列字串
- u8 陣列轉換成 string陣列
- C#陣列與集合的區別C#陣列
- C#:檔案、byte[]、Stream相互轉換C#
- c# 陣列排序C#陣列排序
- Golang 陣列和字串之間的相互轉換[]byte/stringGolang陣列字串
- C# 一維陣列如何快速實現陣列元素的資料型別的轉換?C#陣列資料型別
- 浮點數(float)線上轉位元組陣列的工具陣列
- C# convert ImageSource to byte arrayC#
- C#學習 陣列(22)C#陣列
- 瞭解下C# 陣列(Array)C#陣列
- float浮點數線上轉位元組陣列轉換工具陣列
- c#列舉轉換C#
- C# 獲取時間戳並從10進位制時間戳轉換成16進位制byte陣列C#時間戳陣列
- C#快速入門教程(19)—— 索引器與陣列C#索引陣列
- c語言中陣列的宣告與初始化C語言陣列
- C# float浮點數與二進位制相互轉換(IEEE754)C#
- C# unsafe 快速複製陣列C#陣列
- 【C#】山脈陣列的峰頂索引C#陣列索引
- ArrayList動態陣列物件 c# 1231陣列物件C#
- C#資料結構與演算法3-C# 串和陣列C#資料結構演算法陣列
- c#刪除有序陣列中的重複項C#陣列
- C# 列舉遍歷和轉換C#
- 面試最常問的陣列轉樹,樹轉陣列 c++ web框架paozhu實現面試陣列C++Web框架
- xml與陣列的相互轉換——phpXML陣列PHP
- C#中如何獲取二維陣列的行數和列數?C#陣列
- C#高效能陣列複製實驗C#陣列
- iOS 字典轉陣列,陣列轉字典iOS陣列
- C# 列舉與位列舉概述C#
- 陣列與字串方法與相互轉換陣列字串
- C/C++ 二維陣列的理解(多維陣列)C++陣列
- PHP xml 轉陣列 陣列轉 xml 操作PHPXML陣列
- C#二維陣列在SLG中的實現和使用C#陣列
- string與char陣列相互轉換陣列
- Java 集合與陣列互相轉換Java陣列
- Java中List與陣列互轉Java陣列
- C語言 指標與陣列C語言指標陣列