跳到主要内容

在 ShineBlink 上的Lua编程常用技巧总结

(1) 将字节流型的table转换成字符串

问题描述

比如有一个 tab = { 0x68,0x65,0x6c,0x6c,0x6f }

如何将tab转换成 str = "hello"

解决代码举例:

--例如从TF卡中读取abc.txt文件中的数据到read_tab中,但全是字节型的,这里我们把它转换成字符串print出
read_number, read_tab = LIB_Fread("abc.txt",0)
if read_number > 0 then
--将从txt文件中读取的字节流转换成文本形式str
for i=1,#read_tab do
read_tab[i] = string.char(read_tab[i])
end
str = table.concat(read_tab)
print(str)
end

(2)将一个字符串转换成整型数并执行移位操作

问题描述:

比如有一个字符串 str="AAEE1234",但我们想把它转换成整型数 0xAAEE1234 来执行移位操作,因为只有整型数才能执行移位操作

解决代码举例:

str = "AAEE1234"
val = tonumber(str, 16) --转换成16进制整型数
new_val = val << 8

(3)将json中某个字符串属性值转换成16进制整型数

问题描述:

比如需要从一个名为 str 的 json 字符串中的 "Bits":"923465ff" 属性中提取出属性值并转换为 0x923456ff 十六进制整型数

解决代码举例:

--这行代码实现功能:例如:从json字符串"Bits":"923465ff"中解析出"923456ff",
--然后用tonumber转换成真正的16进制整型数 0x923456ff
str = "{\"Bits\": \"923456ff\"}"
local var = tonumber(LIB_JsonParse(str, "$.Bits", "String"))

(4)打印table中的每个元素

问题描述:

比如有一个 tab = {1,2,3,4,5} ,我们希望用print函数在屏幕上打印输出每个元素,即:1,2,3,4,5

解决代码举例:

tab = {1,2,3,4,5}
str = table.concat(tab, ",") --用","号间隔,将tab中每个元素合并成一个字符串
print(str)

(5)数据结构的实现

问题描述:

如果我们希望实现类似C语言中的struct结构体,可以通过Lua中强大且灵活的table表来实现

解决代码距离:

--下面定义了一个Table表作为结构体
TestTable = {
{
{tp=0,idx=12,maxv=1000,minv=0,hand="p2",ntab={"n2","n3","n0","n1"}},
{tp=0,idx=13,maxv=4000,minv=0,hand="p3",ntab={"n4","n9","n11"}},
{tp=0,idx=14,maxv=5000,minv=0,hand="p4",ntab={"n7","n12","n13"}}
},
{
{tp=0,idx=16,maxv=60,minv=5,hand="p5",ntab={"n0","n1"}},
{tp=0,idx=8,maxv=9999,minv=0,hand="p6",ntab={"n2","n3","n4","n5"}}
}
}
--下面的代码示例了如何访问结构体中具体的元素
print(TestTable[1][1].hand) --打印结果是"p2"
print(TestTable[1][3].maxv) --打印结果是5000
print(TestTable[2][2].ntab[4]) --打印结果是"n5"