Luatos は 16 進シーケンスを格納するために文字列を使用します. データを解析するときは、16 進配列に変換する必要があり、変換メソッドが記述されています.
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] 虚拟机已停止运行