App Inventor 四字节转单精度浮点数

Posted 望天吼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了App Inventor 四字节转单精度浮点数相关的知识,希望对你有一定的参考价值。

如果您觉得本文对您有用,希望您点赞,收藏并且把它分享出去,不明白的可以在评论区留言,我会一一解答,感谢您的支持!!
可以访问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





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

拆分成符号位,指数,尾数

最后是**至关重要**的那个公式

最后完成了转换方法!

以上是关于App Inventor 四字节转单精度浮点数的主要内容,如果未能解决你的问题,请参考以下文章

Abplc浮点数怎么传给4个字节

怎么将4字节16进制转化成浮点数

浮点类型说明浮float,double有啥区别啊

浮点类型说明浮float,double有啥区别啊

MySQL数据类型+简单操作

急求十六进制转浮点数C程序!!!