Lua字节数组与float互转
纪念那些在双流工厂奋斗的日夜,防爆表屏项目 是一次很成功的实践,包括设计的页面堆栈和跳转机制 历史回退机制 页面密码保护机制 串口分包机制 ,运用综合所学来搭建的屏上独立内循环系统 ,自恋点说的话各方面都堪称经典,估计那堆代码基本上没人能上得了手吧,完美归完美 太小众冷门了 难度太大 ,最终估计结果也是躺那吃灰,有时候你自认为费尽心思完成的所谓作品 其实公司领导根本就不关注那个点。反正有的是钱嘛,又请人过来编一堆屎一样的火星文然后又放弃。还有就是扯皮拉筋的事太多,有些东西并不是纯软件技术能解决的,根本推动不了,让你设身处地鞠躬尽瘁的解决所有 软件 硬件 甚至是化学传感器适配问题 达到让用户买账的程度 ,我也是醉了 打这么多年工说实话头一次到这么艰难的境地,以前从没有这种感觉,甚至在单位把CAD学会了,PLC也学了一点,这社会三十岁后的技术人员都是这么艰难了么。另外感谢那些批评我的人是你们让我进步
字节数组转float
1 function hexToFloat(x)
2 --print(type(x));
3 local sign = 1
4 local mantissa = string.byte(x, 3) % 128
5 for i = 2, 1, -1 do mantissa = mantissa * 256 + string.byte(x, i) end
6 if string.byte(x, 4) > 127 then sign = -1 end
7 local exponent = (string.byte(x, 4) % 128) * 2 +
8 math.floor(string.byte(x, 3) / 128)
9 if exponent == 0 then return 0 end
10 mantissa = ((mantissa * (2 ^ -23)) + 1) * sign
11 local result= (mantissa * (2 ^ (exponent - 127)));
12
13 result = math.floor(result * 10+ 0.5) / 10;
14 return result;
15 end
float转字节数组,为了实现这个可是让我访便了各个角落,自己不断的测试 ,扯淡的Lua 写点小逻辑脚本倒是没问题,字节和位操作局限性真的非常的大,面向对象规模化方式程序编写局限性也非常的大,还有相对于c语言没有那种指针的灵活运用也是局限很大,但最终的最终好歹还是实现了 有可能全网就改造的这段代码能正常在屏上运行了。如果有谁也遇到这个问题找到这来了那么 很幸运你的问题能够得到解决了
1 function floattohex(floatNum)
2 if(floatNum == 0)then
3 return 0;
4 end
5 ---给一个浮点数 33.758
6 --1.将浮点数分成整数和小数
7 num_z,num_x= math.modf(floatNum/1)
8 --print("整数:" .. num_z .. " 小数:".. num_x)
9 --2.将整数部分化成二进制
10 str_z = ""
11 intercount = 0; --转换成二进制一共多少位
12 num1 = num_z
13 if(num1 == 0)then
14 intercount = 0
15 str_z = "0"
16 else
17 repeat
18 num = num1
19 num1= math.modf(num1/2)
20 num2 = num - num1*2
21 intercount = intercount + 1 --阶乘
22 str_z = str_z .. num2
23 until (num1 == 0)
24 end
25 str_z = string.reverse(str_z)
26 --print("整数:" .. str_z)
27 --3.将小数转换成二进制
28 str_x = ""
29 num2 = num_x
30 repeat
31 num2 = num2 *2
32 num1,num2 = math.modf(num2/1)
33 str_x = str_x .. num1
34 until(num2 == 0 or #str_x >=40)
35 --print("小数:"..str_x)
36 --4.浮点数的二进制表示
37 --print("浮点数的二进制表示 :" .. str_z .. "." .. str_x)
38
39 --浮点数的二进制表示 :一种:0.00110101110000101000111
40 --两种:1011.01101011100001010
41 --5.首先确认整数是否大于0,
42 --(1)==0 右移 查找小数二进制何时有1
43 --(2) >0 左移
44
45 e = 0
46 str_m =""
47 if(num_z == 0)then
48 num_1 =string.find(str_x,"1") --阶
49 e = -num_1
50 str_m = string.sub(str_x,num_1+1,-1)
51 else
52 e = intercount - 1
53 str_m = string.sub(str_z,2,-1) .. str_x
54 end
55 --??考虑str_m是否有23位
56 if(#str_m ~= 23)then
57 if(#str_m > 23)then
58 str_m = string.sub(str_m,1,23)
59 end
60 if(#str_m <23)then
61 len_m = 23 - #str_m
62 for i = 1,len_m do
63 str_m = str_m .."0"
64 end
65 end
66
67 end
68 M = str_m
69 --print("M = " .. M)
70
71 --考虑把它转换成二进制
72 E = e + 127
73 str_e = "" --E的二进制
74 intercount_e = 0
75 num1 = E
76 repeat
77 num = num1
78 num1= math.modf(num1/2)
79 num2 = num - num1*2
80 intercount_e = intercount_e + 1 --阶乘
81 str_e = str_e .. num2
82 until (num1 == 0)
83
84 if(#str_e ~= 8)then
85 len_e = 8 - #str_e
86 for i = 1,len_e do
87 str_e = str_e .."0"
88 end
89 end
90 E = string.reverse(str_e)
91 --print("E的二进制字符串:" .. E)--此时str_e 是E的二进制字符串
92
93
94
95 --6.确定 S
96 if(floatNum > 0)then
97 S = 0
98 else
99 S = 1
100 end
101 --print("S:" .. S)
102 --7.将S E M 二进制转换
103 str = S .. E .. M
104 --print(string.len(str));
105
106 --result = string.format("%08X",tonumber(str,2))
107
108 --'01000010110010000000000000000000'
109 --以下是进行改造后的 字节处理代码 ,经测试正常工作
110 floatar ={0,0,0,0};--浮点4字节
111 local indxx=0;
112 for i = 1, 4, 1 do
113 floatar[4-(i-1)] = 0;
114
115 for j = 1, 8, 1 do
116 --floatar[i]=floatar[i]|
117 --print((i-1)*8+(j).."gggggggggggggggggg")
118 indxx = (i-1)*8+(j);
119 --print(tonumber(str[indxx])<<(j-1));
120 --扯淡的嵌入式lua环境 不准使用tunumber 会死机
121 if string.sub(str,indxx,indxx)=='1' then
122 floatar[4-(i-1)] = floatar[4-(i-1)]| (1<<(8-j));
123 else
124 floatar[4-(i-1)] = floatar[4-(i-1)]| (0<<(8-j));
125 end
126 --floatar[4-(i-1)] = floatar[4-(i-1)]| (tonumber(string.sub(str,indxx,indxx))<<(8-j));
127 end
128 end
129
130 --print(type(floatar[1]));
131 --print("floagstart---------------------------------------")
132 resultstr = "";
133 for i = 1, 4, 1 do
134 --print(string.format("%02X",floatar[i]))
135 resultstr = resultstr.. ( string.format("%02X",floatar[i]));
136 end
137 --print("floatEnd---------------------------------------")
138 --print ("result =" .. result)
139 --print("**************************************************")
140 --return result;
141 return resultstr;
142 end
Lua字节数组与float互转的更多相关文章
- (IEEE-754) 字节数组与浮点数之间的互相转换(MODBUS float类型)
在做上位机开发过程中,经常会碰到字节数组与浮点数,整数等数据之间的转换,有时为了验证数据是否解析正确,得借助于IEEE浮点数工具,本文把基于c#实现的浮点数与字节数组(或16进制的字符串)转换的实现方 ...
- float型数据与字节数组的转化
float型数据与字节数组的转化 字节(float)浮点数为例. 一.C语言 转化常见的方法有: 1.强制指针类型转换. [html] view plain copy //转换float数据到字节数组 ...
- 使用Apache的Hex类实现Hex(16进制字符串和)和字节数组的互转
包名称:org.apache.commons.codec.binary 类名称:org.apache.commons.codec.binary.Hex 1.字节数组(byte[])转为十六进制(Hex ...
- python 字节数组和十六进制字符串互转
. 字节数组 --> 十六进制字符串 >>> a = 'ab' >>> a.encode('hex') ' . 十六进制字符串 --> 字节数组 > ...
- C#中结构体定义并转换字节数组
最近的项目在做socket通信报文解析的时候,用到了结构体与字节数组的转换:由于客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性,这一 ...
- JAVA IO分析二:字节数组流、基本数据&对象类型的数据流、打印流
上一节,我们分析了常见的节点流(FileInputStream/FileOutputStream FileReader/FileWrite)和常见的处理流(BufferedInputStream/B ...
- Scala字节数组转换为数字
1. 2个字节数组转换为整数 def bytes2uint8(_bytes: Array[Byte], _offset: Int): Int = { val b0 = _bytes(_offset) ...
- 【Java】字节数组转换工具类
import org.apache.commons.lang.ArrayUtils; import java.nio.charset.Charset; /** * 字节数组转换工具类 */ publi ...
- c#实现RGB字节数组生成图片
我是要用c#来实现,现在已经知道了rgb数组,那么如何快速生成一张图片呢? 其实这个话题并不局限于是rgb字节数组的顺序,只要你能对于上表示红.绿.蓝的值,就可以生成图片.知道了原理,做什么都简单了. ...
- C# 结构体定义 转换字节数组 z
客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性. [StructLayoutAttribute(LayoutKind.Sequent ...
随机推荐
- 洛谷 NOIP 2023 模拟赛 T2 汪了个汪
洛谷 NOIP 2023 模拟赛 T2 汪了个汪 考试建出正解图不知道怎么处理,题解区樱雪喵博客薄纱. 樱雪喵题解链接 Ps:笔者语文爆炸,不建议阅读本文 思路 首先你会发现,一共有 \(\frac{ ...
- Python网络爬虫第一弹
03.Python网络爬虫第一弹<Python网络爬虫相关基础概念> 爬虫介绍 引入 之前在授课过程中,好多同学都问过我这样的一个问题:为什么要学习爬虫,学习爬虫能够为我们以后的发展带来那 ...
- dotnet学习笔记-专题01-异步与多线程-01
专题01 异步 多线程 1. Thread类 1.1 使用Thread创建线程 namespace ConsoleApp1; internal class Program { private stat ...
- JVM性能优化, Part 5:Java的伸缩性
本文由 ImportNew - ImportNew读者 翻译自 Javaworld.如需转载本文,请先参见文章末尾处的转载要求. ImportNew注: JVM性能优化系列文章前4篇由ImportNe ...
- pycharm之debugger使用
1.未打断点运程序,输出全部结果 2.打断点后,点击debug,代码执行到断点前停止(断点所在行不执行) 3.step over,是在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子 ...
- WPS Pro 最新专业版,一站式办公
聊一聊 随着科技的进步,办公软件已经成为现代人工作和学习中不可或缺的重要工具.无论是在企业.学校还是个人使用中,办公软件都能够帮助我们提高工作效率.组织信息和进行沟通.在众多的办公套件中,微软的Off ...
- MongoDB|TOMCAT定时切割日志文件的脚本
MongoDB用过一段时间后,日志较大,需要定时进行日志切割. 一.切割bash: splitlogmongo.sh #!/bin/bash log_dir="/home/mongodb/l ...
- openEuler欧拉修改SSH端口
修改SSH端口的主要原因是提高服务器的安全性.默认情况下,SSH服务运行在端口22上,因此攻击者和自动化脚本通常会针对此端口发起暴力破解攻击.密码猜测和其他恶意活动. vim /etc/ssh/ssh ...
- Excel使用IF{1,0}虚拟数组+VLOOKUP实现联合查询
以此案例举例: 使用IF({1,0})建立虚拟数据的方法,整体输入的公式是: =VLOOKUP(E2&F2,IF({1,0},A:A&B:B,C:C),2,0) 输入完公式之后,需要按 ...
- 中电资讯-乘风破浪数字经济,银行如何Hold数据?
近期各类规划密集发布人行金融科技发展规划发布 金融标准化"十四五"规划发布 "十四五"信息化规划发布 -- 和数据应用有关的各项政策密集出炉 数字经济发展中如何 ...