luatos里使用字符串来存储hex序列,解析数据时,需要转换为hex数组,写了一个转换方法
s = "1234567891234567" --测试字符串 print(string.len(s)) --将字符串转换为hex数组,初学,转换可能有点麻烦^_^ function toHexArray( data ) local array={} local index=1 for i=1,data:len()/2 do array[index] = (data :byte((i-1)*2+1)-0x30) * 16 + data :byte(i*2)-0x30; print(i, data :byte((i-1)*2+1), data :byte(i*2)) index = index+1; end return array end function get_u16( hexarray, b,e) local val = hexarray[b] * 0x100 + hexarray[e] return val; end function get_f16( hexarray, b,e, rato) local val = hexarray[b] * 0x100 + hexarray[e] return val / rato; end --测试代码 local bytes={} bytes = toHexArray(s) local val for i=1,8 do val = bytes[i] print(i, bytes[i]) print(string.format("%d: 0x%x",i, val)) end --解析无符号short val = get_u16(bytes, 1,2) print(string.format("1: 0x%x %d", val,val)) --解析无符号short val = get_u16(bytes, 3,4) print(string.format("2: 0x%x %d", val,val)) --解析为浮点数,保留1位小数 val = get_f16(bytes, 5,6, 10) print(string.format("3: %.1f %d", val,get_u16(bytes, 5,6)))
可以使用luatos的在线测试环境:
https://wiki.luatos.com/_static/luatos-emulator/lua.html
执行结果:
[23:33:54] 虚拟机初始化完毕 [23:33:54] 16 [23:33:54] 1 49 50 [23:33:54] 2 51 52 [23:33:54] 3 53 54 [23:33:54] 4 55 56 [23:33:54] 5 57 49 [23:33:54] 6 50 51 [23:33:54] 7 52 53 [23:33:54] 8 54 55 [23:33:54] 1 18 [23:33:54] 1: 0x12 [23:33:54] 2 52 [23:33:54] 2: 0x34 [23:33:54] 3 86 [23:33:54] 3: 0x56 [23:33:54] 4 120 [23:33:54] 4: 0x78 [23:33:54] 5 145 [23:33:54] 5: 0x91 [23:33:54] 6 35 [23:33:54] 6: 0x23 [23:33:54] 7 69 [23:33:54] 7: 0x45 [23:33:54] 8 103 [23:33:54] 8: 0x67 [23:33:54] 1: 0x1234 4660 [23:33:54] 2: 0x5678 22136 [23:33:54] 3: 3715.5 37155 [23:33:54] 虚拟机已停止运行