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