如果您覺得本文對您有用,希望您點贊,收藏并且把它分享出去,不明白的可以在評論區留言,我會一一解答,感謝您的支持!!
可以訪問https://app.wxbit.com/,展示里面搜索"四位元組轉單精度浮點數"下載原始碼檔案哦!
公司的一個專案,儀器下位機通過所使用的BLE藍牙要把他的檔案發送給我(手機app),然后我匯入到我的本地資料庫進行顯示,然后再上傳到網路資料庫做備份,然后他就給了我一個檔案,檔案名不重要,重要是的他告訴我,在資料傳輸的時候走的是tcp協議吧,啥協議我沒記住,就知道一個重點名字叫:位元組流,也就是說藍牙發送過來是一個位元組一個位元組發過來的,我這邊一個位元組一個位元組的接收,
小意思,藍牙連接方面我還沒有寫,我先把這個檔案決議一下,
于是我加入檔案管理器控制元件,讀取檔案
資料

不瞞你說,我當時超開心啊,果然可以讀出來啊,NB,
可是這都是啥啊?跟我想要的資料哪也不挨哪啊,
大神告訴我:我告訴你資料結構啊?(以前聽說過資料結構啊,感覺好難啊)
于是他就給我了這個,并且告訴我基本上都是ASCII碼的
資料型別
資料1:char [8] //字符型占8位元組
資料2:u32 //日期型,后面會詳解
資料3:u8 null[12] //留空用的,以便后期擴展,1位元組,12個
資料4:u8 //1個位元組
資料5:char [16] //2個位元組
資料6:float //4個位元組,這個就是困擾我了很久的
基本上用到的就這幾種資料型別,然后就把資料直接和我的資料對接就可以了,
起初我都不明白是啥意思,于是又重新復習了一下計算機的知識,
計算機都是用0,1來存盤資料的,一個位元組=8位,可不要小看了這8位,有些人為了節省空間,竟然把日期(年月日,時分秒)放在32位里面表示,我看了都崩潰了,真會過日子,
8位(bit) = 1位元組(Byte,B)
1024Byte = 1Kb
1024Kb = 1Mb
1024Mb = 1Gb
1024Gb = 1Tb
位是個什么概念呢,就是資料的最小單位,我給你做一個比較,單反相機現在拍一張清晰的照片大約是30Mb吧,那他等于多少位呢?30×1024×1024×8=251658240位,2.5億位,這樣你能想象什么概念了吧,
8位元組資料決議
言歸正傳,于是我就這樣決議了第一種資料char [8]

1位元組資料決議
于是我就迫不及待的要決議第二種資料呢,我記得大神當時說了,日期型暫時可以不要,然后我就跳過了,
剩下的u8也簡單,就占一個位元組么,小意思,

期間在轉到一組資料的時候,char [16],那不就是占2個位元組了嗎?16位啊?轉出來也是亂碼,全是菱形塊里面有問號的,

就是這樣,我想是不是字符集的問題,于是就把ASCII改成了GBK試試看,

果然好用哈,又一條資料被我決議成功了,
遇到阻礙后的幾種嘗試
1.與字符集有關?
然后就剩下float浮點數了,我把浮點數也按照第一種方式,4個位元組放進去,發現出現的是亂碼,好難啊,
然后,問了大神,大神的回復是:浮點型幾乎是所有編程語言支持的型別,也許appinventor為了開發容易,把底層封裝起來了,再加上是圖形化,功能沒有做全,
嗯,的確是有可能啊,可是我為了要實作也得干啊,
于是我就在想,1個位元組是8位(我以前只知道2進制,10進制,16進制相互轉換,我還沒有聽過用位元組轉浮點數的)我都無語了,這轉的了嗎?直接用文本奪好,就為了省那點空間嗎,太會過日子了吧!!!心里一萬句抱怨哈,
4個位元組那就是32位了?然后我就放進去32個,發現還是亂碼,到底是什么呢?
然后我就在想是不是編碼的問題,我就查了一下ASCII字符集,

雖然長了點,但是用起來真方便啊,
現在的目標是把82.8這個浮點數轉成4個位元組,于是我查ASCII表

用逆推法,在資料里面應該可以找到這樣連續的資料,那就是我要的資料,
結果找了半天也沒有找到,里面竟然還有負數,
當我在嘗試轉換的時候,appinventor提示無法轉換,我就在想,位元組到底是個什么進制的呢?我看都是數,應該挺像10進制的,然后網上又搜索了好多文章,其中有一篇寫的是偏移量這個概念,我是弄懂了個大概,但無法表達得更清晰,意思就是說8位2進制最多能容納255個數,有些時候不一定是從0 ~ 255,也有可能是-127 ~ 127,所以這個127對于0 ~ 255這個區間來說,就是0 ~ 255的偏移量,我是這么理解的,
于是我就在資料里面找了一個樣本:[-101,-103,-91,66]這四個數就是4個位元組,我認為他是10進制的,我現在要把他轉成16進制,2進制,我看看到底長啥樣?能不能在ASCII表上查到,于是我就用這種方法把負數格式化成了能夠被appinventor接受的形式,

啥叫按位與,按位與就是參與運算的兩數各對應的二進位相與,只有對應的兩個二進制位都為1時,結果位才為1,參與運算的兩個數均以補碼出現,
這一塊我也是沒搞太清楚,你就記住0xFF和你的資料按位與,就能得到你想要的符合的資料,0xFF就是16進制,0x可以省略,FF二進制就是11111111,
其實網上有很多可以直接轉的函式,或者是C的聯合體(union),你看看這寫的多簡單,聯合體里面宣告一個浮點數,一個字符陣列,然后把這幾個按順序放進去,然后就可以輸出了!我沒測驗,就是說這個意思,
union U{
float v;
unsigned char c[4];
unsigned int i;
}uu;
main(){
uu.c[0]=0xcd;
uu.c[1]=0xcc;
uu.c[2]=0xcc;
uu.c[3]=0x41;
printf(" %f %x",uu.v,uu.i);
}
然后我試了,好像還是不行,用ASCII字符集也是不行,這下更費勁了,
IEEE 754
然后忽然從網上找到了IEEE 754標準,這個標準的大概意思就是說:浮點型的構成是啥樣的,還有科學計數法啥的,然后就是位元組二進制轉換成浮點型的方法,
4位元組32位浮點數是啥樣的?

應該如何計算?

于是我得到了一個結果:位元組轉浮點數與ASCII無關!!!
于是我是這么操作的:
創建4個全域變數,將輸入值分給4個全域變數,按位與,并賦值

分別判斷長度并格式化補0





合并成字串,要逆序哦(分為大端碼和小端碼)大家可以查查為啥要逆序

拆分成符號位,指數,尾數

最后是**至關重要**的那個公式

最后完成了轉換方法!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/291356.html
標籤:其他
