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

 

posted @ 2023-02-25 01:04  assassinx  阅读(552)  评论(0编辑  收藏  举报